通用正则表达式以捕获各种可选组

时间:2018-06-30 21:37:24

标签: c# regex regex-group

我正在寻找一种使用正则表达式选择包含各种组(其中一些是可选的)的行并捕获这些组(当然是找到的组)的方法。在阅读了有关stackoverflow和许多实验的信息后,我想到了这种通用的方法:

^(?:.*?(aaa).*?|.*?)(xxx).*?(yyy)(?:.*?([^ \n]+).*?|.*?)$

所以可选组的总称是:

(?:.*?(blabla).*?|.*?)

在以下情况下,上述方法存在回溯问题:

  • 大文本;
  • 什么都不匹配;
  • 只有可选组时。

任何想法都如何创建足以捕获可选组的通用正则表达式?泛型的意思是,就像在我发现的示例中一样,可以轻松扩展为各种组模式。 谢谢。

1 个答案:

答案 0 :(得分:0)

更醒目的方法可以解决此问题。代替 。*?我们使用了经过调整的贪婪令牌,该令牌允许除可选搜索字词之外的所有内容:

^(?:(?!bla).)*(bla)?(?:(?!bla).)*$

Demo

与原始方法(即使在large text上)相比,它的性能要好得多,并且仍然易于扩展和维护;例如您可以交替添加其他受限制的字词到temped令牌中:

(?:(?!bla|blub).)*(bla|blub)?(?:(?!bla|blub).)*

Demo(注意:开始/结束锚已删除)

rexegg.com tutorial解释了有关贪婪令牌的几乎所有内容,并显示了可能的变化。

Code Sample