Не удается избежать обратного слэша с помощью регулярного выражения?
Я использую следующее 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'));