2010-10-22 64 views
1

我有一些運行的JavaScript使用替換正則表達式來修改頁面上的內容。不過,我遇到了特定的正則表達式量詞問題。我讀過的所有文檔(我知道它也以其他語言的正則表達式工作)說JavaScript支持{N}{N,}{N,N}量詞。也就是說,您可以指定您想要的特定匹配數量或一系列匹配。例如。 (zz){5,}至少匹配10個z,並且z{5,10}將匹配從5到10的任意數量的z,不多也不少於z。Javascript RegExp量詞問題

問題是,我可以匹配一個確切的數字(例如z{5}),但不是範圍。離我最近的數字是,它與正則表達式字符串中的逗號有關,但我不明白爲什麼,也不能解決這個問題。我試圖轉義逗號,甚至使用unicode十六進制字符串作爲逗號(\u002C),但無濟於事。爲了消除任何可能的誤解,並解決在評論中提出的一些問題,這裏有一些額外的信息(在評論中也可以找到):我試圖以各種可能的方式創建數組,包括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');,var[1] = /z{5,}/gi;等。該陣列在for-loop中用作somevar.replace(regex[i], subst[i]);

+1

可能想發佈您使用的JS代碼,因爲範圍量詞在JS正則表達式中得到支持就好了。 – MooGoo 2010-10-22 01:18:42

+1

發佈示例代碼並告訴我們您嘗試使用的瀏覽器和版本。 – some 2010-10-22 02:28:52

+0

因此,我有一個數組,其中包含像「/ z {5,}/gi」這樣的值,我的腳本用於循環訪問數組的內容並執行「var.replace(regex [i],other [i]);」 – klanni 2010-10-22 17:01:10

回答

0

我想我已經想通了。我正在構建數組的各種方式來實現它,但我認爲有所不同的是在正則表達式字符串周圍使用單引號,而不是像[/z{5,}/,/t{7,9}/gi]那樣打開它。所以當我做了['/z{5,}/','/t{7,9}/gi'],似乎已經修復它。儘管就像艾倫的例子一樣,如果沒有他們,它有時也能正常工作。我想我的情況不是這樣。

3

也許我誤解的問題,但它似乎像JavaScript實現的{N}運營商是相當不錯的:

"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 
+0

不幸的是,這個答案與我的問題無關,因爲我的問題特別是「爲什麼這個功能不適合我的情況?」 - 如果問題是「這是否工作?」這將是一個很好的答案。或者「JS支持這種類型的正則表達式?「 – klanni 2010-10-22 16:58:25

+0

我很抱歉,當沒有具體的實現細節問一個問題時,我認爲它一定是關於一個功能的。當你說'我讀過的所有文檔(並且我知道它也以其他語言的正則表達式工作)表示JavaScript支持{N},{N,}和{N,N}量詞。「那麼你似乎在質疑JavaScript支持本身。 – 2010-10-22 17:17:32

+0

呃,我說希望指出我不知道的事實我不認爲它是否支持JS,我猜它會因此而退化;) – klanni 2010-10-23 00:01:54

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.