正则表达:超越前瞻性

时间:2016-03-17 03:22:53

标签: javascript regex

我在JavaScript中遇到了一个负面的预测问题。对于正则表达式来说,这似乎是一件愚蠢的事情,但它仍然是我想要解决的问题。

说我有以下字符串:

>>a+b+c

我知道前两个字符(a,b)可以是任何顺序,但最后一个字符(c)必须是最后一个。字符不能重复,所有字符必须用加号(+)分隔。

我以下列方式使用否定前瞻:

^>>(?:([ab+])(?!.*\1))*$

测试以下字符串直到这一点:

>>a+b //true, as expected
>>b+a //true, as expected

然而,当我试图超越负面的前瞻时,我似乎无法让事情发挥作用:

^>>(?:([ab+])(?!.*\1))*\+c$

测试以下字符串:

>>a+b+c //false, expecting true
>>b+a+c //false, expecting true

我不理解什么?

2 个答案:

答案 0 :(得分:0)

您的问题是您的捕获与模式中的单个+匹配,然后无法重复(即,输入中+的重复会导致匹配失败)。

请尝试使用此正则表达式:

^>>(?:([ab])\+(?!.*\1))*c$

答案 1 :(得分:0)

尝试添加。在你的最后*之前。您希望在执行超前检查后匹配字符,而不是匹配整个检查的0或更多。 (假设你只想要一个+ b + c或b + a + c来匹配,虽然如果那些是唯一的组合,你可能只是将这两个与一个或者匹配。)

^>>(?:([ab+])(?!.*\1)).*\+c$

我相信这也只会匹配 a + c ,所以这可能是你想要的:

^>>(?:([ab])\+(?!\1)).\+c$