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

How can I force two patterns to capture to the same group in regEx

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

我正在尝试使用正则表达式捕获 info1info2(如果需要)。

我想到了以下模式:

!([^!]*?)!(.*?)!|!(.*?)! 

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

!foo!bar! -> Group1: foo Group2:bar
!foo!     -> Group3: foo
(https://regex101.com/r/D9d6YP/1)

在这两个表达式中,foo表示相同的意思,后面的处理方式相同。我想在同一个组中捕获它,无论是否有第二个组。

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

!(?<info1>[^!]*?)!(?<info2>.*?)!|!(?<info1>.*?)!

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

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

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

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

regex demo

详情:

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