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

Я использую следующее regex

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

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

Ответ 1

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

Например:

regex("\\\\")

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

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

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

regex(\\)

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


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

re.compile(r'\\')

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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