Не удается избежать обратной косой черты с помощью регулярного выражения?

114

Я использую следующее регулярное выражение

^[a-zA-Z0-9\',!;\?\$\^:\\\/`\|~&\" @#%\*\{}\(\)_\+\.\s=-]{1,1000}$

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

Итон Б.
источник
4
Я только что исправил опечатку в названии, но есть что-то очень удивительное в названии "Не могу избежать обратной реакции с помощью регулярного выражения?" На самом деле!
Адам Кроссленд,
1
@AdamCrossland Разве мы не все хотим, чтобы регулярное выражение могло помочь нам избежать негативной реакции? > _>
Итон Б.
2
Черт возьми, я просто хочу, чтобы я мог избежать обратной реакции от регулярного выражения.
Адам Кроссленд,

Ответы:

227

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

Например:

regex("\\\\")

интерпретируется как ...

regex("\\" [escaped backslash] followed by "\\" [escaped backslash])

интерпретируется как ...

regex(\\)

интерпретируется как регулярное выражение, которое соответствует одной обратной косой черте.


В зависимости от языка вы можете использовать другую форму цитирования, которая не анализирует escape-последовательности, чтобы избежать использования их большого количества - например, в Python:

re.compile(r'\\')

Знак rперед кавычками делает его необработанной строкой, которая не анализирует escape-символы обратной косой черты.

Янтарь
источник
14
хе-хе ... Я только что столкнулся с этим и нужно было добавить три. Я просто продолжал добавлять обратную косую черту, пока это не сработало.
billynoah
ммм, с какой стати это регулярное выражение переинтерпретируется дважды, а не один раз, как это должно быть для PCRE?
Джим Майклс
3
@JimMichaels, потому что не все языки имеют неэкранированные литералы регулярных выражений, и, таким образом, иногда сам язык программирования интерпретирует экранирование косой черты один раз в своем строковом синтаксисе, а полученная строка затем передается механизму регулярных выражений (который интерпретирует escape-символы косой черты в синтаксисе регулярных выражений).
Эмбер
1
однажды, давным-давно, мне пришлось захватить xpath элемента, единственной идентифицирующей особенностью которого был путь к файлу Windows, а затем сгенерировать программу (в виде строки), в которой xpaths должны быть представлены в виде строк. в какой-то момент на промежуточных этапах использовалось 8 обратных косых черт для представления одной обратной косой черты в пути к файлу. Хотя это самый высокий результат, который я когда-либо получал.
Zackkenyon 06
Это может стать еще более запутанным при поиске обратной косой черты вместе с шаблонами, требующими метасимволов. Возьмем, к примеру, обратную косую черту, за которой следует цифра. Теперь вы бы смотрели на следующее выражение , пытаясь выяснить , что происходит: new RegExp('\\\\\\d');.
jabacchetta
15

Если это не литерал, вы должны использовать его, \\\\чтобы получить, \\что означает экранированную обратную косую черту.

Это потому, что есть два представления. В строковом представлении вашего регулярного выражения у вас есть "\\\\", что и отправляется парсеру. Парсер увидит, \\что он интерпретирует как действительную обратную косую черту с экранированием (которая соответствует одной обратной косой черте).

Вивин Палиат
источник
10

Обратная косая черта \- это escape-символ для регулярных выражений. Следовательно, двойная обратная косая черта действительно будет означать одинарную буквальную обратную косую черту.

\ (backslash) followed by any of [\^$.|?*+(){} escapes the special character to suppress its special meaning.

ссылка: http://www.regular-expressions.info/reference.html

Брэд
источник
4

Из http://www.regular-expressions.info/charclass.html :

Обратите внимание, что единственными специальными символами или метасимволами внутри класса символов являются закрывающая скобка (]), обратная косая черта (\\), каретка (^) и дефис (-). Обычные метасимволы - это обычные символы внутри класса символов, и их не нужно экранировать обратной косой чертой. Для поиска звездочки или плюса используйте [+ *]. Ваше регулярное выражение будет работать нормально, если вы избегаете обычных метасимволов внутри класса символов, но это значительно снижает удобочитаемость.

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

На каком языке вы пишете регулярное выражение?

Нейт
источник
0

Это решение устранило мою проблему при замене тега br на '\ n'.

alert(content.replace(/<br\/\>/g,'\n'));
hltsydmr
источник