如何强制两个模式捕获到正则表达式中的同一组

Max*_*ime 6 .net regex regex-group

我必须解析一个字符串,格式为!info1!info2!,并且info2是可选的。

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

我想出了以下模式:

!([^!]*?)!(.*?)!|!(.*?)! 
Run Code Online (Sandbox Code Playgroud)

它有效,但我对结果不满意:

!foo!bar! -> Group1: foo Group2:bar
!foo!     -> Group3: foo
(https://regex101.com/r/D9d6YP/1)
Run Code Online (Sandbox Code Playgroud)

在这两种表达方式中,foo表示相同的事物,并且随后以相同的方式进行处理。我想将它捕获在同一组中,无论是否有第二组。

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

!(?<info1>[^!]*?)!(?<info2>.*?)!|!(?<info1>.*?)!
Run Code Online (Sandbox Code Playgroud)

失败并显示错误消息“子模式名称必须是唯一的”。

有什么办法可以捕获同一组中的不同模式吗?

Wik*_*żew 1

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

!([^!]*)!(?:([^!]*)!)?
         ^^^        ^^
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示

细节:

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