2011-05-11 179 views
3

如何合并正则表达式?合并正则表达式

编辑:这是否为考试准备。问题是编写一个正则表达式来查找所有具有奇数个a和偶数个b的字符串?

即代替|对于OR,我需要一种机制来仿真和

我有两个正则表达式:

1) to find odd number of a's: 

^[^a]*a([^a]*a[^a]*a)*[^a]*$ 

2) to find even number of b's: 

^([^b]*b[^b]*b)*[^b]*$ 
+1

虽然构建这样的正则表达式可能是可能的,但它会非常复杂(请记住,正则表达式只是一个状态机,每个输入字符都会为其定时一次)。你可能会更好地运行两个单独的正则表达式,并对结果进行“与”运算。 – 2011-05-11 13:57:48

+0

我完全同意奥利,但我很好奇的实际答案:-) – 2011-05-11 13:59:49

+0

这是可能的构建这样的正则表达式[与现有的相同的原则构建,只有更多],但不能结合两个现有的正则表达式与一些运算符(perl中的maye除外,我从来不确定perl正则表达式的局限性,以及零宽度预览匹配或其他),我怀疑“找到所有有奇数个字符串的字符串a和偶数个b“是他的实际问题。 – Random832 2011-05-11 14:00:11

回答

6

你可以做到这一点使用lookahead expressions(此处显示为一个详细的正则表达式,因为它实在是太难看了,更加上单行):

^         # start of string 
(?=(?:(?:[^a]*a){2})*[^a]*$)  # assert an even number of as 
(?=[^b]*b(?:(?:[^b]*b){2})*[^b]*$) # assert an odd number of bs 
.*         # match anything 
$         # end of string 

如果您只是验证,最后两行可以被删除 - 它们只是匹配整个字符串。

+0

+1打我吧 – 2011-05-11 14:03:05

+0

@Tim - 谢谢,这是在两个正则表达式组件中都能看到的常见做法吗? – user559142 2011-05-11 14:04:29

+0

有没有办法做到这一点,而不是它锚定到行末?就像你想用c + {thing} c +'在“ccccababacccc”中匹配它一样? – Random832 2011-05-11 14:06:23