Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何强制将两个模式捕获到regEx中的同一组_.net_Regex_Regex Group - Fatal编程技术网

.net 如何强制将两个模式捕获到regEx中的同一组

.net 如何强制将两个模式捕获到regEx中的同一组,.net,regex,regex-group,.net,Regex,Regex Group,我必须解析一个字符串,格式为!信息1!信息2,并且info2是可选的 我正在尝试使用正则表达式捕获info1和info2,如果需要的话 我提出了以下模式: !([^!]*?)!(.*?)!|!(.*?)! 这是可行的,但我对结果不满意: !foo!bar! -> Group1: foo Group2:bar !foo! -> Group3: foo (https://regex101.com/r/D9d6YP/1) 在这两个表达式中,foo的意思是相同的,之后将以相同的

我必须解析一个字符串,格式为
!信息1!信息2,并且
info2
是可选的

我正在尝试使用正则表达式捕获
info1
info2
,如果需要的话

我提出了以下模式:

!([^!]*?)!(.*?)!|!(.*?)! 
这是可行的,但我对结果不满意:

!foo!bar! -> Group1: foo Group2:bar
!foo!     -> Group3: foo
(https://regex101.com/r/D9d6YP/1)
在这两个表达式中,
foo
的意思是相同的,之后将以相同的方式进行处理。我想在同一组中捕获它,无论是否有第二组

我曾尝试使用命名捕获组,但它们似乎无法重用

!(?<info1>[^!]*?)!(?<info2>.*?)!|!(?<info1>.*?)!
!(?[^!]*?)!(?.*?)!|!(?.*?)!
失败,错误消息为“子模式名称必须唯一”


有没有办法在同一组中捕获不同的模式?

您可以使用可选的非捕获组将两个备选方案合并到一个分支中:

!([^!]*)!(?:([^!]*)!)?
         ^^^        ^^

详细信息

  • -a
  • ([^!]*)
    -第1组:除
    以外的任何0+字符
  • -a
  • (?:([^!]*)!)?
    -一个可选的非捕获组(其结果不存储在内存中,没有为其分配ID)匹配1或0个
    • ([^!]*)
      -第2组:除
      以外的任何0+字符
    • -a

请提供一个没有可选部分的示例字符串。您的regex101链接似乎暗示您正在使用PCRE模式?正确吗?不,它是.NET,regex101中的味道只是默认的。因此没有分支重置,但粘贴的代码与Regex演示不同,演示\n。“我希望regex101站点永远都能运行起来。”当然,它是不同的。它不是正则表达式工作的证明,它展示了正则表达式在实际字符串中的行为。在C#中使用正则表达式时,它们是独立的,而在正则表达式演示中,我使用单个多行字符串。因为
[^!]
匹配任何字符,但是
,它匹配一个换行符,并混淆了根据换行符测试正则表达式的人。