Что означает [^] в регулярных выражениях 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 ]