用正则表达式不能逃脱反斜杠?


113

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

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

我知道它很丑陋,但是到目前为止,它已经达到了它的目的,而不是因为反斜杠被忽略了,所以我认为应该这样做,\\而不是不允许这样做\\\。有任何想法吗?


4
我只是修正了标题中的拼写错误,但标题“无法摆脱正则表达式的强烈反响吗?”的标题确实令人赞叹不已。确实!
亚当·克罗斯兰

1
@AdamCrossland我们不是都希望正则表达式可以帮助我们摆脱反弹吗?> _>
伊顿·B

2
哎呀,我只是希望我能摆脱正则表达式的强烈反对。
亚当·克罗斯兰

Answers:


224

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

例如:

regex("\\\\")

被解释为...

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

被解释为...

regex(\\)

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


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

re.compile(r'\\')

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


14
呵呵...我刚遇到这个问题,需要添加三个。我一直添加反斜杠,直到它起作用。
billynoah 2015年

嗯,为什么这个正则表达式会被重新解释两次,而不是像对PCRE那样一次被解释?
吉姆·迈克尔斯

3
@JimMichaels,因为并非所有语言都未转义过正则表达式文字,因此有时编程语言本身会以其字符串语法解释一次斜杠转义,然后将生成的字符串传递给regex引擎(该引擎以正则表达式解释斜杠转义)。
2013年

1
一次,很久以前,我必须捕获一个元素的xpath,该元素的唯一标识功能是Windows文件路径,然后生成一个程序(作为字符串),其中xpaths表示为字符串。在中间步骤的某一时刻,有8个反斜杠用于表示文件路径中的单个反斜杠。那是我有史以来的最高水平。
Zackkenyon

当搜索反斜杠以及需要元字符的模式时,这甚至变得更加令人费解。例如,找到一个反斜杠后跟一个数字。现在,您将盯着下面的表达式尝试弄清楚发生了什么:new RegExp('\\\\\\d');
雅巴乔塔

15

如果不是字面量,则必须使用,\\\\这样就可以得到\\转义的反斜杠。

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



4

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

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

要将反斜杠作为字符包含在内,而在字符类中没有任何特殊含义,则必须使用另一个反斜杠对其进行转义。[\\ x]匹配反斜杠或x。可以通过用反斜杠转义转义符(^)和连字符(^)或将它们放在不具有特殊含义的位置来包括它们。我建议使用后一种方法,因为它可以提高可读性。要包括插入标记,请将其放置在左括号旁边的任何位置。[x ^]匹配x或插入符号。您可以将右括号放在开括号或负号插入符之后。[] x]与右括号或x匹配。[^] x]匹配不是右括号或x的任何字符。连字符可以在右括号之后,右括号之前或负号插入符之后。

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


0

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

alert(content.replace(/<br\/\>/g,'\n'));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.