提问人:esqew 提问时间:6/9/2011 最后编辑:Liamesqew 更新时间:2/23/2023 访问量:185059
在 javascript 中使用正则表达式时,“Nothing to repeat”错误是什么意思?
What does the "Nothing to repeat" error mean when using a regex in javascript?
问:
我是正则表达式的新手,我正在尝试将其应用到我的一个新项目中,看看我是否可以学习它并将其添加到我的技能重复中。但是,我在这里遇到了障碍。
我正在尝试通过使用以下函数来查看用户的输入中是否包含非法字符:.search
if (name.search("[\[\]\?\*\+\|\{\}\\\(\)\@\.\n\r]") != -1) {
...
}
但是,当我尝试执行包含此行的函数时,它会为该特定行抛出以下错误:
Uncaught SyntaxError: Invalid regular expression: /[[]?*+|{}\()@.
]/: Nothing to repeat
我一辈子都看不出我的代码出了什么问题。谁能给我指出正确的方向?
答:
首先,在字符类中,大多数字符不需要转义 - 它们只是文字。[...]
因此,您的正则表达式应该是:
"[\[\]?*+|{}\\()@.\n\r]"
这为我编译。
评论
您需要将用于转义正则表达式特殊字符的反斜杠加倍。但是,正如 @Bohemian 所指出的,大多数反斜杠都是不需要的。不幸的是,他的回答和你的答案一样。你真正想要的是:
反斜杠由读取字符串的代码解释,而不是传递给正则表达式解析器。你想要:
"[\\[\\]?*+|{}\\\\()@.\n\r]"
请注意四倍的反斜杠。这绝对是必要的。然后,传递给正则表达式编译器的字符串与@Bohemian的字符串相同,并且可以正常工作。
评论
基于@Bohemian,我认为最简单的方法是只使用正则表达式文字,例如:
if (name.search(/[\[\]?*+|{}\\()@.\n\r]/) != -1) {
// ... stuff ...
}
正则表达式文字很好,因为您不必转义转义字符,并且某些 IDE 会突出显示无效的正则表达式(对我非常有帮助,因为我经常搞砸它们)。
对于谷歌旅行者:当你打错字并将正则表达式运算符加倍时,也会出现这个愚蠢的无用错误消息:+
好:
\w+
不行:
\w++
评论
+
*
/(*\s*)/
+
*
好吧,就我而言,我不得不在正则表达式的帮助下测试电话号码,并且我遇到了同样的错误,
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}/
这个答案可能对那些遇到相同类型错误的人有所帮助,但从这个角度来看,他们和我一样犯错误的机会很大!干杯:)
评论
\+
)
例如,我在 express node.js 中遇到过这个问题,当尝试为不以/internal
app.get(`\/(?!internal).*`, (req, res)=>{
经过长时间的尝试,当使用 RegExp 对象传递它时,它就可以工作了new RegExp()
app.get(new RegExp("\/(?!internal).*"), (req, res)=>{
如果您在路由中遇到此常见问题,这可能会有所帮助
评论
new RegExp
如果正则表达式以 开始,也会发生这种情况。?
?
可能用作量词 - 因此可能期望在它之前出现其他东西,因此“没有什么可重复的”错误。正则表达式字符串中没有任何东西在它之前,所以它无法量化任何东西;没有什么可重复的/没有什么可以量化的。?
?
还有另一个作用 -- 如果前面有 它可能表示环视断言或其他特殊结构的开始。请参阅下面的示例。?
(
如果忘记在以下 lookbehind 断言周围写括号,这将导致 OP 的错误:()
?<=x
不對:const xThenFive = /?<=x5/;
正确:const xThenFive = /(?<=x)5/;
这是一个积极的回顾:我们正在寻找一个 5,它前面有一个,例如,它将匹配 in 而不是 in。/(?<=x)5/
x
5
x563
5
x652
评论
SyntaxError: nothing to repeat
'*'