Вопрос по javascript, regex – Что означает [^] в регулярных выражениях Javascript?

18

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

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

Соответствующий тест производительности:jsperf.com/match-any-char-regex Mathias Bynens
Хм. Он отрицает множество, но если множество пусто ... сопоставить что-либо, пока это не ничто? Это не кажется правильным. Что совпадает с []? [^] должно совпадать с тем, что [] не совпадает. Okonomiyaki3000
Основываясь на ответах ниже, он звучит так, как будто это означает, что «это выражение не должно использоваться»! jahroy

Ваш Ответ

3   ответа
2

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

Давайте разберемся[^]:

[] это класс персонажа.

[^ это:

Negation of the character class, matching a character not listed in the character class.

Выdidn't определить любые символы в классе символов.So the behavior is undefined, Смысл естьnothing отрицать и, следовательно, это соответствуетanything.

@Derek Потому что. не соответствует символам новой строки.
@nhahtdh, отредактировано на основе вашего комментария.
So the behavior is undefined. Это может заставить людей поверить, что это неопределенное поведение, которое не соответствует действительности, поскольку оно определено в спецификации ECMA, хотя реализация варьируется.
Так почему бы ему просто не сделать.
1

anything except nothing = everything

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

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

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

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

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

Отличный пост! Не могли бы вы поподробнее рассказать о старых версиях Safari и Opera?
Благодарю. Я не уверен, какие версии решали проблемы. Я знаю, что Safari 3 ошибся. (В раннем v3 Safari было много малоизвестных сюрпризов RegExp, так как он запускал PCRE со слишком простым слоем JS поверх него.) Opera все еще ошибалась, когда я впервые писалxregexp.com/cross_browser , Вероятно, они исправили это вскоре после выпуска Acid3, так как Acid3 явно тестирует пустые классы символов (к моему ужасу, поскольку до тех пор, пока это не появилось, я надеялся, что ES сможет измениться, чтобы соответствовать традиционному поведению). Похоже, что IE на самом деле не решал проблему до v9 (я отредактировал мой пост).

Похожие вопросы