【问题标题】:How can I force two patterns to capture to the same group in regEx如何强制两种模式捕获到 regEx 中的同一组
【发布时间】:2017-08-11 09:25:04
【问题描述】:

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

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

我想出了以下模式:

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

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

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

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

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

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

失败并显示错误消息'a sub-pattern name must be unique.

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

【问题讨论】:

  • 请提供一个不带可选部分的示例字符串。
  • 您的 regex101 链接似乎暗示您正在使用 PCRE 模式?对吗?
  • 不,它是 .NET,regex101 中的风格只是默认风格。
  • 所以没有分支重置,但是stackoverflow.com/questions/5377782/…

标签: .net regex regex-group


【解决方案1】:

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

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

regex demo

详情

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

【讨论】:

  • 粘贴的代码和Regex Demo不同,demo有\n。我希望 regex101 网站永远存在。
  • @ClownMan 当然不一样。它不是正则表达式工作的证明,它展示了正则表达式如何处理现实生活中的字符串。当您在 C# 中使用正则表达式时,它们是独立的,而在正则表达式演示中,我使用 single multiline 字符串。由于[^!] 匹配除! 之外的任何字符,因此它匹配换行符,并使测试正则表达式与 的人混淆。
猜你喜欢
  • 2020-11-19
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
  • 2021-11-29
  • 1970-01-01
  • 2018-03-21
相关资源
最近更新 更多