Javascript RegExp量词问题

时间:2010-10-22 01:01:08

标签: javascript regex

我有一些运行的JavaScript使用正则表达式替换来修改页面上的内容。不过,我遇到了特定正则表达式量词的问题。我读过的所有文档(我也知道它在其他语言中使用正则表达式)表示JavaScript支持{N}{N,}{N,N}量词。也就是说,您可以指定所需的特定匹配数或一系列匹配项。例如。 (zz){5,}连续匹配至少10个z,z{5,10}匹配任意数量的z,从5到10,不多也不少。

问题是,我可以匹配一个确切的数字(例如z{5}),但不能匹配范围。我能想到的最接近的是它与正则表达式字符串中的逗号有关,但我不明白为什么也不能解决这个问题。我已经尝试转义逗号,甚至使用unicode十六进制字符串作为逗号(\u002C),但无济于事。

为了解决任何可能的误解,并解决评论中提到的一些问题,这里有一些额外的信息(也在评论中找到):我尝试过以各种可能的方式创建数组,包括{{1 },var = [/z{5,}/gi,/a{4,5}/gi];,以及var = [new RegExp('z{5,}', 'gi'), new RegExp('a{4,5}', 'gi')];var[0] = new RegExp('z{5,}'), 'gi');等。数组在for循环中用作var[1] = /z{5,}/gi;

3 个答案:

答案 0 :(得分:3)

也许我误解了这个问题,但似乎{n}运算符的Javascript实现非常好:

"foobar".match(/o{2,4}/); // => matches 'oo'
"fooobar".match(/o{2,4}/); // => matches 'ooo'
"foooobar".match(/o{2,4}/); // => matches 'oooo'
"fooooooobar".match(/o{2,4}/); // => matches 'oooo'
"fooooooobar".match(/o{2,4}?/); // => lazy, matches 'oo'
"foooobar".match(/(oo){2}/); // => matches 'oooo', and captures 'oo'
"fobar".match(/[^o](o{2,3})[^o]/); // => no match
"foobar".match(/[^o](o{2,3})[^o]/); // => matches 'foob' and captures 'oo'
"fooobar".match(/[^o](o{2,3})[^o]/); // => matches 'fooob' and captures 'oo'
"foooobar".match(/[^o](o{2,3})[^o]/); // => no match

答案 1 :(得分:1)

它对我有用。

var regex = [/z{5,}/gi,/a{4,5}/gi];
var subst = ['ZZZZZ','AAAAA'];
var somevar = 'zzzzz aaaaa aaaaaaa zzzzzzzzzz aaazzzaaaaaa';
print(somevar);
for (var i=0; i<2; i++) {
    somevar = somevar.replace(regex[i], subst[i]);
}
print(somevar);

输出:

zzzzz aaaaa aaaaaaa zzzzzzzzzz aaazzzaaaaaa
ZZZZZ AAAAA AAAAAaa ZZZZZ aaazzzAAAAAa

构造函数版本也适用:

var regex = [new RegExp('z{5,}','gi'),new RegExp('a{4,5}','gi')];

See it in action on ideone.com.

答案 2 :(得分:0)

我想我已经明白了。我正在以各种方式构建数组以使其工作,但我认为不同之处在于使用正则表达式字符串周围的单引号,而不是像[/z{5,}/,/t{7,9}/gi]那样使其保持打开状态。所以,当我做['/z{5,}/','/t{7,9}/gi']似乎修复了它。尽管如此,就像在Alan的例子中一样,如果没有它们,它确实有效。我猜不是在我的情况下。