JavaScript: недопустимый квантификатор в регулярном выражении

Регулярное выражение строится на лету, но я вывел его в firebug:

(.{1,38})(+|$\n?)

ошибка

invalid quantifier +|$\n?)

Я не уверен, с чего начать.

Фактический код:

var re = top.RegExp;
var regex = new re("(.{1," + len + "})(+|$\\n?)", "gm");

ОБНОВЛЕНИЕ: в соответствии с инструкциями Беннора Маккарти я изменил код на этот:

 var regex = new re("(.{1," + len + "})(\+|\$\\n?)", "gm");

Firebug все еще говорит мне это:

invalid quantifier +|$\n?)
[Break on this error] var regex = new re("(.{1," + len + "})(\+|\$\\n?)", "gm"); 

ДРУГОЕ ОБНОВЛЕНИЕ Похоже, мне пришлось сделать двойную косую черту, и это решило проблему!

окончательный код

var regex = new re("(.{1," + len + "})(\\+|\\$\\n?)", "gm");

person Stephen    schedule 14.09.2010    source источник
comment
\n вставит новую строку в вашу строку. Попробуйте \\n избежать этого.   -  person titaniumdecoy    schedule 15.09.2010
comment
В коде это \\n. Firebug показывает его как одну косую черту.   -  person Stephen    schedule 15.09.2010
comment
квантификаторы означают «сколько я пытаюсь сопоставить», один из которых «+». Другие *, ? и {n,m}   -  person Luke Schafer    schedule 15.09.2010


Ответы (2)


Проблема заключается в +, который является квантификатором, который вам нужно избежать.

Используйте это вместо этого:

/(.{1,38})(\+|$\n?)/

или внутри строки:

"(.{1,38})(\\+|$\\n?)"

Если вы хотите сопоставить литерал $, за которым следует новая строка, вам нужно экранировать $ с помощью \ (или \\ внутри строки — см. мой последний комментарий ниже для объяснения).

Вот некоторая информация о квантификаторах.

person Bennor McCarthy    schedule 14.09.2010
comment
также нужно экранировать $, если он не предназначен для соответствия концу строки, чего, похоже, не происходит, поскольку у него есть (возможно, избыточный) '\n'. если он хочет, чтобы он соответствовал фактическим символам $\n, лучше использовать \$$ - person Luke Schafer; 15.09.2010
comment
Судя по коду, который он добавил, похоже, что он пытается сопоставить конец строки и использует символ новой строки (используя модификатор multi-line) - person Bennor McCarthy; 15.09.2010
comment
Итак, исходя из моего окончательного кода выше, нужна ли косая черта перед $? Я вижу, вы убрали это из своего примера. - person Stephen; 15.09.2010
comment
Это зависит от того, что вы пытаетесь сопоставить, если это конец строки, вам не нужно его избегать. Если вы пытаетесь сопоставить буквальный символ «$», то вы это делаете. Поскольку вы пишете свое регулярное выражение внутри строки, вам нужно удвоить обратную косую черту, потому что обратная косая черта имеет особое значение внутри строки, т.е. вам нужна одна обратная косая черта, чтобы экранировать специальный символ в регулярном выражении, и одна, чтобы экранировать косая черта в строке. - person Bennor McCarthy; 15.09.2010

Квантификатор означает «сколько». Чаще всего используется «*», что означает ноль или более. Квантификатор «+» означает один или несколько.

Когда вы получаете сообщение об ошибке о недопустимом квантификаторе, это почти всегда означает, что у вас есть квантификатор, которому он не принадлежит. Например, поскольку они означают «сколько», они, очевидно, должны относиться к чему-то. Если вы поместите один в начале шаблона или группы, регулярное выражение думает: «сколько _из чего?

В вашем конкретном случае у вас есть «+» сразу после символа группировки «(», поэтому вы получаете ошибку. Вам нужно либо избежать «+», чтобы он не рассматривался как квантификатор, либо поместить какой-либо символ или группу вы хотите сопоставить перед ним.В вашем случае это, вероятно, первое, если вы пытаетесь сопоставить фактический символ «+».

person Bryan Oakley    schedule 14.09.2010