2010-10-22 6 views
1

У меня есть JavaScript, который работает, использует замену регулярными выражениями для изменения содержимого на странице. Тем не менее, у меня проблема с конкретным квантором регулярных выражений. Вся документация, которую я прочитал (и я знаю, что она работает в regex на других языках тоже) говорит, что JavaScript поддерживает кванторы {N}, {N,} и {N,N}. То есть вы можете указать определенное количество совпадений, которое вы хотите, или диапазон совпадений. Например. (zz){5,} соответствует не менее 10 z в строке, а z{5,10} соответствует любому числу z от 5 до 10, не более и не менее.Ошибка квантора 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; и т. Д. Массив используется для цикла в виде somevar.replace(regex[i], subst[i]);.

+1

Возможно, вы захотите опубликовать JS-код, который вы используете, поскольку кванторы диапазона поддерживаются в JS-regex просто отлично. – MooGoo

+1

Отправьте пример кода и сообщите нам, в каком браузере и версии вы его пробовали. – some

+0

Итак, у меня есть массив со значениями, такими как «/ z {5,}/gi», и мой скрипт для-петли через содержимое массива и выполняет «var.replace (regex [i], other [i]); – klanni

ответ

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

+0

Приношу свои извинения, когда задан вопрос без конкретных деталей реализации, я предполагаю, что это должно быть о функции вообще. Когда вы говорите« Вся документация, которую я прочитал (и я знаю, что она работает и в регулярном выражении на других языках) говорит, что JavaScript поддерживает кванторы {N}, {N,} и {N, N}. Тогда кажется, что вы задаете вопрос о самой поддержке JavaScript. –

+0

Ну, я сказал, что надеюсь указать на то, что я был Не спрашивайте, поддерживалась ли она в JS, я думаю, что это было неприятно.;) – klanni

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.