Javascript负面lookbehind相同的字符

时间:2014-10-10 06:52:24

标签: javascript regex

我面临以下问题 - 我有一个序列:

[yyy]zyyyyz[yyy]zyyyyyyyyz[yyy]

这是我需要匹配的输入(除了[],我用来突出显示所需的匹配)。 我的正则表达式应该只匹配正好有3个字符的'y'序列。所以

yyy - should match
zyyyz - should match
zyyyy - should not match
yyyyz - should not match

实现正则表达式的第一部分很容易。当然

y{3}(?!y)

匹配y的所有序列,其中包含3个字符,后面没有y。问题是javascript不支持lookbehinds所以没有简单的方法来检查前面的字符...如何实现这一点?我想我无法反转字符串...我的意思是可以有多个匹配序列,不仅仅是一个,所以它不会有任何好处。

2 个答案:

答案 0 :(得分:2)

不幸的是,我认为不可能在JavaScript中为精确匹配(组0)。但是,(?:[^y]|^)(y{3})(?!y)应该将组1与所有情况的要求相匹配,包括两个实例由单个非y,字符串开头和字符串结尾分隔。等价地,([^y]|^)(y{3})(?!y)/将匹配组2,如果您正在进行替换,则组1将恢复正则表达式需要使用的第一个字符。例如:

var re = /([^y]|^)(y{3})(?!y)/g;
"yyy0yyy0000yyyyyy00yy0yyyy0000yyy".replace(re, "$1---")
// => "---0---0000yyyyyy00yy0yyyy0000---"
"[yyy]zyyyyz[yyy]zyyyyyyyyz[yyy]".replace(re, "$1---")
// => "[---]zyyyyz[---]zyyyyyyyyz[---]"
"yyyzyyyyzyyyzyyyyyyyyzyyy".replace(re, "$1---")
// => "---zyyyyz---zyyyyyyyyz---"

答案 1 :(得分:0)

匹配 ...所以您正在尝试验证输入。 TRUE当字符串中有三个孤立的y序列,否则返回FALSE

然后我来了这个正则表达式:

(?=(?:[^y]|^)(yyy)(?:[^y]|$))

您还可以使用所有已捕获的yyy群组。

<强> Live demo