正则表达式中无法转义反斜杠?

158

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

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

我知道它看起来不太好,但到目前为止除了反斜杠不能被允许使用之外,它已经达到了预期的效果。我尝试过使用\\代替\\\,但结果相同。
有什么想法吗?


8
我刚刚修正了标题中的错别字,但是标题“无法通过正则表达式逃避反弹”的确很棒!是的! - Adam Crossland
2
@AdamCrossland 我们都希望正则表达式能帮助我们逃避反弹吧?>_> - Eton B.
3
我只是希望能够避免因正则表达式而引起的反弹。 - Adam Crossland
7个回答

292

如果你想在程序的字符串中使用这个正则表达式,你可能需要使用四个反斜杠(因为字符串解析器会在“取消转义”时删除其中两个反斜杠,而正则表达式需要两个转义后的反斜杠)。

例如:

regex("\\\\")

被解释为...

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

被解释为...

regex(\\)

这里的内容被解释为一个匹配单个反斜杠的正则表达式。


根据语言不同,你可能可以使用一种不会解析转义序列的不同引用形式,以避免使用太多 - 例如在Python中:

re.compile(r'\\')

在引号前面加上r,则将其变为原始raw字符串,不会解析反斜杠转义符。


29
呵呵……我刚碰巧遇到这个问题,需要再加三个反斜杠。我一直添加反斜杠,直到它起作用为止。 - But those new buttons though..
为什么这个正则表达式会被重新解释两次,而不是像在PCRE中应该的那样只解释一次呢? - Jim Michaels
4
因为不是所有语言都具有未转义的正则表达式字面量,所以有时编程语言本身会在字符串语法中解释一次斜杠转义,然后生成的字符串将传递给正则表达式引擎(该引擎解释正则表达式语法中的斜杠转义)。 - Amber
1
很久很久以前,我曾经需要捕获一个元素的xpath,其唯一标识特征是Windows文件路径,然后生成一个程序(作为字符串),其中xpaths将被表示为字符串。在中间步骤中,有8个反斜杠用于表示文件路径中的单个反斜杠。但那是我所达到的最高点了。 - Zackkenyon
当搜索需要元字符的模式以及反斜杠时,这可能会变得更加复杂。例如,查找后跟数字的反斜杠。现在,您将盯着以下表达式,试图弄清楚发生了什么:new RegExp('\\\\\\d'); - jabacchetta
谢谢!这个解决了我在Swift中一个棘手的否定搜索问题。 - brian_schick

25
如果不是一个字面量,你需要使用\\\\来得到\\这个转义后的反斜杠符号。这是因为有两种表示方式。在正则表达式的字符串表示中,你需要写上"\\\\",它会被传送给解析器,解析器将会看到\\并且理解成一个有效的转义后反斜杠符号(匹配一个单独的反斜杠符号)。

15

反斜杠\是正则表达式的转义字符。因此,双反斜杠确实表示一个单独的、字面的反斜杠。

\(反斜杠)后跟任何 [\^$.|?*+(){}] 中的一个,可以转义特殊字符以抑制其特殊含义。

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


简单解释 - Hariom Yadav

5
http://www.regular-expressions.info/charclass.html得知:
请注意,字符类中唯一的特殊字符或元字符是右方括号(]),反斜杠(\\),脱字符(^)和连字符(-)。通常的元字符在字符类中是普通字符,不需要用反斜杠转义。要搜索星号或加号,请使用[+ *]。如果您在字符类中转义常规元字符,则正则表达式将正常工作,但这样做会显着降低可读性。
要将反斜杠作为无特殊含义的字符包含在字符类中,必须使用另一个反斜杠进行转义。 [\\ x]匹配反斜杠或x。右方括号(]),脱字符(^)和连字符(-)可以通过用反斜杠进行转义或将它们放置在不具有特殊含义的位置来包含。我建议使用后一种方法,因为它提高了可读性。要包含脱字符,请将其放置在除开头方括号之外的任何位置。 [x ^]匹配x或脱字符。您可以将右方括号直接放在左方括号后面,也可以将否定脱字符放在左方括号后面。 [] x]匹配右方括号或x。 [^] x]匹配不是右方括号或x的任何字符。连字符可以直接放在左方括号后面,也可以放在右方括号前面或否定脱字符后面。 [-x]和[x-]都匹配x或连字符。
您使用什么语言编写正则表达式?

1
你可以在末尾使用?来跳过一个反斜杠\。
regex("\\\\?")

0

这个解决方案在将br标签替换为'\n'时解决了我的问题。

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

-1
在某些情况下,可以使用 . 代替 \ 并避免转义反斜杠。

enter image description here


这完全是错误的;.匹配任何字符,而不仅仅是反斜杠(或者在字符类中只是一个字面点)。 - tripleee
@tripleee 这正是重点。反斜杠只是一个字符。 - player0
如果你不需要精度,那就对了;但这样使用正则表达式的意义在哪里呢? - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接