Что означает [^] в регулярных выражениях Javascript?

[^a] означает любой символ, отличный от a, мы знаем, но что означает [^] (без следующих символов)? Точно так же, как - теряет смысл символьного диапазона в таких случаях, как [-], я предположил, что [^] будет соответствовать карете. Я слишком долго отлаживал эту проблему, только чтобы узнать, что, по крайней мере, в Chrome 19, похоже, что-то похожее, другими словами, эквивалентно .. Существует ли спецификация, применимая здесь или каково ожидаемое поведение?

Да, я знаю, что могу и, вероятно, должен использовать [\^]. Этот вопрос больше связан с характером болезненного любопытства.

Ответы

Ответ 1

В соответствии со спецификацией JavaScript (ES3 и ES5), [^] соответствует любому единому блоку кода, то же, что и [\s\S], [\0-\uffff], (.|\s) (не используйте это; в отличие от других, он полагается на откат) и т.д. Разница между . заключается в том, что точка не соответствует четырем кодам новой строки (\r, \n, \u2028 и \u2029).

Я не рекомендую использовать [^] или [], потому что они не работают последовательно в кросс-браузере и не позволяют вашим регулярным выражениям работать на других языках программирования. IE <= 8 и более ранние версии Safari используют традиционное (не JavaScript) поведение регулярных выражений для пустых классов символов. Старые версии Opera меняют правильное поведение JavaScript, так что [] соответствует любому модулю кода и [^] никогда не соответствует. Традиционное поведение регулярных выражений состоит в том, что ведущий, unescaped ] внутри символьного класса рассматривается как буквальный символ и не заканчивает класс символов.

Если вы используете библиотеку XRegExp, [] и [^] работают правильно и последовательно перекрестно-браузер. XRegExp также добавляет флаг s (aka dotall or singleline), который делает точку совпадением с любым блоком кода (то же, что и [^] в браузере, который правильно следует спецификации JavaScript).

Ответ 2

Каретка ^ имеет много значений - как и большинство символов в синтаксисе регулярных выражений. Кроме того, все персонажи сильно зависят от их контекста. Чтобы усложнить ситуацию, некоторые символы и синтаксис зависят от базового движка (Perl, Java).

Позвольте разлому [^]:

[] - класс символов.

[^:

Отрицание класса символов, совпадающее с символом, не указанным в классе символов.

Вы не определяли любые символы в классе символов. Таким образом, поведение undefined. Это означает, что нет ничего, что могло бы отрицать, и поэтому оно соответствует чему-либо.

Ответ 3

Значение - это отрицание того, что следует. Здесь ничего не следует, поэтому:

ничего, кроме ничего = все

Однако большинство других механизмов RegEx выдает ошибку в выражении:

  • ereg(): REG_EBRACK
  • preg_match(): Compilation failed: missing terminating ]