如何避免正则表达式中的重复

时间:2015-01-13 09:54:13

标签: regex

说我有以下正则表达式:a+ a+

a+部分需要匹配两次但遗憾的是它是重复的,这意味着对于a+的每次更改,我实际上需要进行2次更改。

如何在没有重复的情况下重写这样的正则表达式,以便更容易阅读和维护?

PS:a+实际上有点复杂。

4 个答案:

答案 0 :(得分:4)

您可以尝试使用子程序

(a+) (?1)

Reference 1Reference 2

  

Perl 5.10,PCRE 4.0和Ruby 1.9支持正则表达式子例程调用。这些与正则表达式递归非常相似。子程序调用仅匹配捕获组内的正则表达式,而不是再次匹配整个正则表达式。您可以从正则表达式的任何位置对任何捕获组进行子例程调用。如果您在其呼叫的组内拨打电话,则您将拥有递归捕获组。

答案 1 :(得分:0)

你可以将你的正则表达式的一部分保存在你正在使用的语言的字符串变量中,并像这样构成完整的正则表达式:

var complexPart = 'a+';    
var completeRegexp = new RegExp(complexPart + ' ' + complexPart);

如果您只是需要在某些应用中使用正则表达式而无法控制,那么子程序是一种方法:http://www.rexegg.com/regex-disambiguation.html#subroutines如果应用使用的引擎支持它们

(a+) (?1)

答案 2 :(得分:0)

您可以执行类似

的操作
(?:a+(?: |$)){2}

但是,这也会使字符串与尾随空格匹配,因此您可能希望添加一个lookbehind以防止:

(?:a+(?: |$)){2}(?<! )

请注意,您已避免重复a+模式,但作为交换,您已复制了分隔空间

另请注意,如果您的模式可以以空格结束,例如,这不会起作用。 [a ]+ [a ]+

答案 3 :(得分:-1)

我不确切地知道你想要什么,但你可以像这样匹配序列N次:

(a+){N}

或小于或等于N次,M次和N次之间,或大于N次:

(a+){,N}
(a+){N,M}
(a+){N,}