我是Regex的新手,我正在尝试将其用于我的一个新项目,看看我是否可以学习并将其添加到我的技能修复中。但是,我在这里遇到了障碍。
我正在尝试使用.search
函数来查看用户输入中是否包含非法字符:
if (name.search("[\[\]\?\*\+\|\{\}\\\(\)\@\.\n\r]") != -1) {
...
}
但是,当我尝试执行该行时,该行包含它,它会针对该特定行抛出以下错误:
Uncaught SyntaxError: Invalid regular expression: /[[]?*+|{}\()@.
]/: Nothing to repeat
我不能为我的生活看到我的代码有什么问题。有人能指出我正确的方向吗?
答案 0 :(得分:75)
您需要加倍用于转义正则表达式特殊字符的反斜杠。然而,正如@Bohemian指出的那样,大多数反斜杠都不需要。不幸的是,他的答案与你的问题一样。你真正想要的是:
反斜杠由读取字符串的代码解释,而不是传递给正则表达式解析器。你想要:
"[\\[\\]?*+|{}\\\\()@.\n\r]"
注意四倍的反斜杠。这绝对需要。传递给正则表达式编译器的字符串与@ Bohemian的字符串相同,并且工作正常。
答案 1 :(得分:6)
建立@Bohemian,我认为最简单的方法就是使用正则表达式文字,例如:
if (name.search(/[\[\]?*+|{}\\()@.\n\r]/) != -1) {
// ... stuff ...
}
正则表达式文字是很好的,因为你不必逃避转义字符,而且某些IDE会突出显示无效的正则表达式(对我来说非常有用,因为我经常搞砸它们)。
答案 2 :(得分:2)
首先,在角色类[...]
中,大多数字符不需要转义 - 它们只是文字。
所以,你的正则表达式应该是:
"[\[\]?*+|{}\\()@.\n\r]"
这为我编译。
答案 3 :(得分:0)
对于Google旅行者:输入类型并加倍Mongoose.prototype.save
正则表达式运算符时,还会显示此愚蠢无益的错误消息:
好的:
+
不行:
\w+
答案 4 :(得分:0)
例如,当我尝试为不以 /internal
开头的路径创建路由时,我在 express node.js 中遇到了这个问题
app.get(`\/(?!internal).*`, (req, res)=>{
经过长时间的尝试,它在使用 new RegExp()
app.get(new RegExp("\/(?!internal).*"), (req, res)=>{
如果您在路由中遇到这个常见问题,这可能会有所帮助
答案 5 :(得分:-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}/
这个答案可能对那些遇到相同类型错误但从我的角度来看有机会像我一样犯错误的人有所帮助!欢呼声:)