用正则表达式无法逃避反斜杠?

Eto*_* B. 105 regex

我正在使用以下正则表达式

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

我知道这很难看,但到目前为止,除了不允许反斜杠之外它还有其他目的,因为它已经逃脱,我也试过\\而不是\\\相同的结果.有任何想法吗?

Amb*_*ber 208

如果你把这个字符串中的一个程序中,你实际上可能需要使用四个反斜杠(因为字符串解析器会删除他们两个当"去转义"它的字符串,然后将正则表达式需要两个为逃过正则表达式反斜杠).

例如:

regex("\\\\")
Run Code Online (Sandbox Code Playgroud)

被解释为......

regex("\\" [escaped backslash] followed by "\\" [escaped backslash])
Run Code Online (Sandbox Code Playgroud)

被解释为......

regex(\\)
Run Code Online (Sandbox Code Playgroud)

被解释为匹配单个反斜杠的正则表达式.


根据语言的不同,您可以使用不解析转义序列的不同形式的引用,以避免必须使用尽可能多的引用 - 例如,在Python中:

re.compile(r'\\')
Run Code Online (Sandbox Code Playgroud)

r前面的行情中使得它的原始的字符串,不分析反斜杠.

  • 呵呵......我刚碰到这个,需要加三个.我只是不断添加反斜杠直到它工作. (11认同)
  • @JimMichaels因为并非所有语言都有未转义的正则表达式文字,因此有时编程语言本身会在其字符串语法中解释一次斜杠转义,然后生成的字符串将传递给正则表达式引擎(它在正则表达式语法中解释斜杠转义). (3认同)

Viv*_*ath 15

如果它不是文字,你必须使用,\\\\这样你就得到\\了一个转义反斜杠.

那是因为有两种表示形式.在正则表达式的字符串表示中,您有"\\\\",这是发送给解析器的内容.解析器将看到\\它解释为有效的转义反斜杠(与单个反斜杠匹配).


Bra*_*rad 9

反斜杠\是正则表达式的转义字符.因此,双反斜杠确实意味着单个字面反斜杠.

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

参考:http://www.regular-expressions.info/reference.html


Nat*_*ate 5

来自http://www.regular-expressions.info/charclass.html

请注意,字符类中唯一的特殊字符或元字符是右括号 (])、反斜杠 (\\)、脱字号 (^) 和连字符 (-)。常见的元字符是字符类中的普通字符,不需要用反斜杠转义。要搜索星号或加号,请使用 [+*]。如果您转义字符类中的常规元字符,您的正则表达式将正常工作,但这样做会显着降低可读性。

要将反斜杠作为没有任何特殊含义的字符包含在字符类中,您必须使用另一个反斜杠对其进行转义。[\\x] 匹配反斜杠或 x。可以通过用反斜杠转义它们或将它们放置在不具有特殊含义的位置来包含右括号 (])、脱字号 (^) 和连字符 (-)。我推荐后一种方法,因为它提高了可读性。要包含插入符号,请将其放置在除左括号之后之外的任何位置。[x^] 匹配 x 或插入符号。您可以将右括号放在左括号或否定插入符号之后。[]x] 匹配右括号或 x。[^]x] 匹配不是右括号或 x 的任何字符。连字符可以紧接在左括号之后、右括号之前或否定插入符号之后。[-x] 和 [x-] 都匹配 x 或连字符。

您用什么语言编写正则表达式?