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


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

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

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

5 92

5 ответов:

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

например:

regex("\\")

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

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

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

regex(\)

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


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

re.compile(r'\')

The r перед кавычками делает его raw строка, которая не анализирует обратную косую черту экранирует.

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

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

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

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

ref:http://www.regular-expressions.info/reference.html

от http://www.regular-expressions.info/charclass.html:

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

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

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

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

alert(content.replace(/<br\/\>/g,'\n'));