我正在寻找一种使用正则表达式选择包含各种组(其中一些是可选的)的行并捕获这些组(当然是找到的组)的方法。在阅读了有关stackoverflow和许多实验的信息后,我想到了这种通用的方法:
^(?:.*?(aaa).*?|.*?)(xxx).*?(yyy)(?:.*?([^ \n]+).*?|.*?)$
所以可选组的总称是:
(?:.*?(blabla).*?|.*?)
在以下情况下,上述方法存在回溯问题:
任何想法都如何创建足以捕获可选组的通用正则表达式?泛型的意思是,就像在我发现的示例中一样,可以轻松扩展为各种组模式。 谢谢。
答案 0 :(得分:0)
更醒目的方法可以解决此问题。代替 。*?我们使用了经过调整的贪婪令牌,该令牌允许除可选搜索字词之外的所有内容:
^(?:(?!bla).)*(bla)?(?:(?!bla).)*$
与原始方法(即使在large text上)相比,它的性能要好得多,并且仍然易于扩展和维护;例如您可以交替添加其他受限制的字词到temped令牌中:
(?:(?!bla|blub).)*(bla|blub)?(?:(?!bla|blub).)*
Demo(注意:开始/结束锚已删除)
此rexegg.com tutorial解释了有关贪婪令牌的几乎所有内容,并显示了可能的变化。