2012-02-01 2 views
-1

У меня есть следующий код JavaScript:Javascript регулярного выражения ошибки недопустимых кванторного

if (url.match(/?rows.*?(?=\&)|.*/g)){ 
     urlset= url.replace(/?rows.*?(?=\&)|.*/g,"rows="+document.getElementById('rowcount').value); 
}else{ 
    urlset= url+"&rows="+document.getElementById('rowcount').value; 
} 

Я получаю ошибку invalid quantifier в /?rows.*?.... Это же регулярное выражение работает при тестировании его на http://www.pagecolumn.com/tool/regtest.htm используя тестовую строку

?srt=acc_pay&showfileCL=yes&shownotaryCL=yes&showclientCL=no&showborrowerCL=yes&shownotaryStatusCL=yes&showclientStatusCL=yes&showbillCL=yes&showfeeCL=yes&showtotalCL=yes&dir=asc&closingDate=12/01/2011&closingDate2=12/31/2011&sort=notaryname&pageno=0&rows=anything&Start=0','bodytable','xyz')

В этой строке, указанное регулярное выражение должно соответствовать:

rows=anything

Я на самом деле даже не нужен /?, чтобы получить он работает, но если я не помещу это в свой javascript, он действует так, как будто это даже не регулярное выражение ... Я ужасен с периодом регулярных выражений, поэтому у меня это довольно запутанно. И эта ошибка является единственной, которую я получаю в консоли ошибок Firefox.

EDIT

Используя эту ссылку я отправил выше, кажется, что ведущие / пытается соответствовать фактическим слеш вместо того, чтобы просто маркировка кода как начало регулярных выражений заявления. Таким образом, ? находится там, так что если он не соответствует / ни к чему, он все равно продолжается.

РЕЗОЛЮЦИЯ

Итак, в конце концов, я должен был изменить свое регулярное выражение к этому:

/rows=.*(?=\&?)/g

Это соответствует слово «строки =», а затем что-нибудь, пока он не попал амперсанд или закончился текст.

+0

Что вы ожидаете от ведущего "?" значить? – Pointy

+0

Я использую его так, чтобы он не возвращал false, даже если '/' ничего не соответствует. – James

+0

Ну, тогда вы хотите поместить остальное регулярное выражение в круглые скобки и поставить «?» ** после ** это, не ранее. Квантеры всегда появляются ** после ** того, на что они ссылаются. – Pointy

ответ

2

regtest.htm производит

new RegExp("?rows.?(?=\&)|.", "") returned a SyntaxError: invalid quantifier

Значение, которое вы в веб-сайт не должен иметь / разделители на регулярное выражение, так что положить в ?rows.*?(?=\&)|.* и он показывает ту же проблему. Ваш код JavaScript должен выглядеть так:

re = /rows.*?(?=\&)|.*/g; 

или подобное (но это бессмысленное регулярное выражение, так как оно соответствует всем). Если вы не можете это исправить, пожалуйста, опишите, что вы хотите, чтобы соответствовать и показывать JavaScript

+0

Да, это то, что сказал Уокен в комментариях. Я думаю, что это моя проблема. Тестер регулярных выражений в Интернете меня смутил. Если они не опубликуют их в качестве ответа, я просто отмечу это как ответ. Но если они это сделают, я должен буду отметить их, поскольку они технически ответили на него в первую очередь. Спасибо хоть. – James

4

Вам нужно избежать первого ?, так как оно имеет особое значение в регулярном выражении.

/\?rows.*?(?=\&)|.*/g 
// ^---escaped 
+0

Я не хочу, чтобы это ускользнуло. В настоящее время я использую это, потому что без первого '/' скрипт не распознает его как регулярное выражение. Поэтому я добавил '?', Чтобы он продолжал работать, если он нашел его 0 раз. Я не пытаюсь сопоставить фактический знак вопроса в строке. Спасибо хоть. – James

+0

@James: Вы говорите о самом первом '/', правильно? Это не является частью самого регулярного выражения. Это просто часть буквенного обозначения, используемого для создания регулярного выражения. Если вы хотите, чтобы он работал, если он нашел 0 элементов, то зачем вообще использовать регулярное выражение? Я думаю, вам нужно сделать шаг назад и описать то, что вы на самом деле пытаетесь достичь. –

+0

@upvoter: этот ответ не отвечает на вопрос! – Borodin

0

Вы могли бы рассмотреть рефакторинга вам код, чтобы выглядеть примерно так:

var url = "sort=notaryname&pageno=0&rows=anything&Start=0" 
var rowCount = "foobar"; 
if (/[\?\&]rows=/.test(url)) 
{ 
    url = url.replace(/([\?\&]rows=)[^\&]+/g,"$1"+rowCount); 
} 
console.log(url); 

Выходной

sort=notaryname&pageno=0&rows=foobar&Start=0