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

时间:2017-08-11 09:25:04

标签: .net regex regex-group

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

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

我想出了以下模式:

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

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

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

请参阅regex demo

<强>详情:

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