2011-06-09 55 views
30

我是新来的正则表达式,我正在尝试将它应用到我的新项目中,看看我是否可以学习它并将其添加到我的技能回复中。但是,我在这里遇到了障碍。Javascript + Regex =无法重复错误?

我想看看如果用户的输入使用.search功能所以在它的非法字符:

if (name.search("[\[\]\?\*\+\|\{\}\\\(\)\@\.\n\r]") != -1) { 
    ... 
} 

然而,当我尝试执行此行包含它的功能,它抛出以下错误为该特定行:

Uncaught SyntaxError: Invalid regular expression: /[[]?*+|{}\()@. 

]/: Nothing to repeat 

我不能为我的生活看到我的代码有什么问题。任何人都可以将我指向正确的方向吗?

回答

50

您需要加倍反斜杠用于转义正则表达式特殊字符。但是,正如@波希米亚指出的那样,大多数反斜杠都是不需要的。不幸的是,他的答案遭遇了和你一样的问题。你真正想要的是:

反斜杠被读取字符串的代码解释,而不是传递给正则表达式解析器。你想:

"[\\[\\]?*+|{}\\\\()@.\n\r]" 

注翻了两番反斜杠。这绝对是需要的。传递给正则表达式编译器的字符串与@Bohemian的字符串相同,并且工作正常。

+3

顺便说一下,四元组\ \只在某些langs中需要;例如java是,perl不是 – Bohemian 2011-06-09 22:13:04

2

首先,在字符类[...]大多数字符不需要转义 - 它们只是文字。

所以,你的正则表达式应该是:

"[\[\]?*+|{}\\()@.\n\r]" 

这编译我。

+0

是的,它编译,但它不能正常工作 – Icet 2017-06-26 08:18:36

+0

@Icet其他答案不适合你吗?如果不是,什么输入是“不工作”? – Bohemian 2017-06-26 08:38:00

+0

例如+44作为输入不起作用。这个解决方案工作正常str.replace(/ [\ - \ [\] \/\ {\} \(\)\ * \ + \?\。\\\^\ $ \ |]/g,“\\ $ &"); – Icet 2017-06-26 10:07:33

4

大厦关闭@Bohemian的,我觉得最简单的方法是只使用正则表达式文字,如:

if (name.search(/[\[\]?*+|{}\\()@.\n\r]/) != -1) { 
    // ... stuff ... 
} 

正则表达式的文字是好的,因为你没有逃跑的转义字符,并一些IDE会突出显示无效的正则表达式(对我来说非常有用,因为我经常把它们搞砸)。