.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#中使用正则表达式时,它们是独立的,而在正则表达式演示中,我使用单个多行字符串。因为[^!]
匹配任何字符,但是代码>,它匹配一个换行符,并混淆了根据换行符测试正则表达式的人。