Javascript + Regex =没有重复的错误吗?


82

我是Regex的新手,我正在尝试将其用于我的新项目之一,以查看是否可以学习并将其添加到我的技能储备中。但是,我在这里遇到了障碍。

我试图通过使用.search函数来查看用户输入中是否包含非法字符:

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

但是,当我尝试执行该函数时,包含该行,因此该特定行会引发以下错误:

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

]/: Nothing to repeat

我一生都看不到代码有什么问题。谁能指出我正确的方向?

Answers:


113

您需要将用于转义正则表达式特殊字符的反斜杠加倍。但是,正如@Bohemian指出的那样,大多数反斜杠都是不需要的。不幸的是,他的回答遭受了与您相同的问题。您真正想要的是:

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

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

注意四倍的反斜杠。这绝对是必要的。然后,传递给正则表达式编译器的字符串与@Bohemian的字符串相同,并且可以正常工作。


3
顺便说一句,只有某些语言需要四元\ 例如Java是,Perl不是
波西米亚风格

我也遇到过同样的情况。需要提醒的是,反斜杠首先由语言语法解释,然后由RegExp解释。
enorl76 '18

8

以@Bohemian为基础,我认为最简单的方法是仅使用正则表达式文字,例如:

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

正则表达式字面量很好,因为您不必转义转义字符,并且某些IDE会突出显示无效的正则表达式(当我不断搞砸它们时,这对我很有帮助)。


2

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

因此,您的正则表达式应为:

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

这为我编译。


@Icet其他答案对您不起作用吗?如果没有,什么输入是“无效的”?
波希米亚

例如+44作为输入不起作用。此解决方案可以正常工作str.replace(/ [\-[] \ / \ {\}()* \ + \?\。\\\ ^ \ $ \ |] / g,“ \\ $&”);
Icet

0

对于Google旅行者:当您进行类型输入并将+正则表达式运算符加倍时,还会显示此愚蠢无益的错误消息:

好的:

\w+

不行:

\w++

-1

好吧,在我的情况下,我不得不在正则表达式的帮助下测试一个电话号码,并且遇到了同样的错误,

Invalid regular expression: /+923[0-9]{2}-(?!1234567)(?!1111111)(?!7654321)[0-9]{7}/: Nothing to repeat'

因此,在我的情况下,发生的错误是正则表达式开始+后的那个运算符/。因此,+用方括号将操作符括起来[+],然后再次发送请求,就像一个魅力一样。

以下将起作用:

/[+]923[0-9]{2}-(?!1234567)(?!1111111)(?!7654321)[0-9]{7}/

对于那些遇到相同类型错误,但有机会像我一样从这种角度获得错误的人,此答案可能会有所帮助!干杯:)


您为什么不只是逃避加号而不是完全移动...?(\+
esqew

谢谢您让我理解@esqew,但是我得到了另一个解决方案:)
Aneeq Ahmad
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.