我刚开始使用Regex,我正尝试将它融入我的一个新项目中,看看我是否可以学习它,并将它添加到我的技能库中。
我尝试使用.search
函数来查看用户的输入是否包含非法字符,如下所示:
if (name.search("[\[\]\?\*\+\|\{\}\\\(\)\@\.\n\r]") != -1) {
...
}
然而,当我尝试执行该行包含的函数时,它会针对该特定行抛出以下错误:
Uncaught SyntaxError: Invalid regular expression: /[[]?*+|{}\()@.
]/: Nothing to repeat
我一辈子都看不出我的代码有什么问题。有人能给我指出正确的方向吗?
7条答案
按热度按时间lpwwtiir1#
你需要将用于转义正则表达式特殊字符的反斜杠加倍。然而,正如@Bohemian指出的,大多数反斜杠都是不需要的。不幸的是,他的答案和你的答案有着同样的问题。你实际上想要的是:
反斜杠由读取字符串的代码解释,而不是传递给正则表达式分析器。
注意四个反斜杠。这是绝对需要的。传递给正则表达式编译器的字符串与@Bohemian的字符串相同,并且可以正常工作。
wgxvkvu92#
在@Bohemian的基础上,我认为最简单的方法是只使用正则表达式文字,例如:
正则表达式文字很好,因为您不必转义转义字符,而且一些IDE会突出显示无效的正则表达式(这对我很有帮助,因为我经常把它们搞砸)。
elcex8rz3#
对于Google旅行者:当您输入错误并将
+
regex运算符加倍时,也会出现这种愚蠢的无用错误消息:好吧:
不好:
1mrurvl14#
首先,在字符类
[...]
* 中,大多数 * 字符不需要转义--它们只是字面量。因此,您的正则表达式应该是:
这对我来说很合适。
bis0qfac5#
嗯,在我的例子中,我不得不在regex的帮助下测试一个电话号码,我得到了同样的错误,
所以,在我的例子中,错误是
+
操作符在正则表达式的开头,所以用方括号[+]
括起+
操作符,然后再次发送请求,工作起来很有魅力。以下将起作用:
zkure5ic6#
例如,当我尝试为不是以
/internal
开头的路径创建路由时,我在express node.js中遇到了这个问题经过长时间的尝试,当使用
new RegExp()
将其作为RegExp对象传递时,它就工作了如果您在路由中遇到此常见问题,这可能会有所帮助
bvpmtnay7#
如果正则表达式以
?
开始,也会发生这种情况。?
可能充当一个量词--因此?
可能期望在它之前出现其他内容,从而出现“nothing to repeat”错误。在正则表达式字符串中,它之前没有任何内容,因此它不能量化任何内容;没有什么可重复的/没有什么可量化的。?
还有另一个作用--如果?
前面是(
,它可能表示lookaround assertion或其他一些特殊结构的开始。如果忘记在后面的lookbehindAssert
?<=x
两边加上()
括号,将导致OP错误:错误:
const xThenFive = /?<=x5/;
正确:
const xThenFive = /(?<=x)5/;
这个
/(?<=x)5/
是一个正向后看:我们正在查找前面带有x
的5,例如,它将匹配x563
中的5
,但不匹配x652
中的5
。