在 javascript 中使用正则表达式时,“Nothing to repeat”错误是什么意思?

What does the "Nothing to repeat" error mean when using a regex in javascript?

提问人:esqew 提问时间:6/9/2011 最后编辑:Liamesqew 更新时间:2/23/2023 访问量:185059

问:

我是正则表达式的新手,我正在尝试将其应用到我的一个新项目中,看看我是否可以学习它并将其添加到我的技能重复中。但是,我在这里遇到了障碍。

我正在尝试通过使用以下函数来查看用户的输入中是否包含非法字符:.search

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

但是,当我尝试执行包含此行的函数时,它会为该特定行抛出以下错误:

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

]/: Nothing to repeat

我一辈子都看不出我的代码出了什么问题。谁能给我指出正确的方向?

JavaScript 正则表达式 匹配

评论

0赞 Akaisteph7 2/17/2023
我的代码只是在抛出,没有迹象表明问题是什么。这个问题让我意识到它与正则表达式有关,我刚刚添加了一个正则表达式,现在一切都有意义了。SyntaxError: nothing to repeat'*'

答:

2赞 Bohemian 6/9/2011 #1

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

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

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

这为我编译。

评论

0赞 Bohemian 6/26/2017
@Icet其他答案对你不起作用?如果不是,什么输入“不起作用”?
0赞 Icet 6/26/2017
例如,+44 作为输入不起作用。这个解决方案工作正常 str.replace(/[\-[]\/\{\}()*\+\?\.\\\^\$\|]/g, “\\$&”);
152赞 andrewdski 6/9/2011 #2

您需要将用于转义正则表达式特殊字符的反斜杠加倍。但是,正如 @Bohemian 所指出的,大多数反斜杠都是不需要的。不幸的是,他的回答和你的答案一样。你真正想要的是:

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

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

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

评论

4赞 Bohemian 6/10/2011
顺便说一句,四重 \ 只在某些朗中需要;例如 java 是的,perl 不是
0赞 enorl76 7/31/2018
我也遇到了同样遇到的嘟嘟声。值得一提的是,反斜杠首先由语言语法解释,然后由正则表达式解释。
0赞 portal TheAnGeLs 7/29/2021
我只想提一下,对 javascript str.search 方法的一些解释似乎是引号之间的字符串是纯字符串,例如 str.search(“hello”),所以有人可能会认为,如果期望字符串只是星号,正确的语法将是 str.search(“*”),这会导致相同的错误“没有什么可重复的”。正确的是 str.search(“\*”)
9赞 NobodyMan 9/12/2014 #3

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

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

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

8赞 Tomáš Hübelbauer 9/23/2020 #4

对于谷歌旅行者:当你打错字并将正则表达式运算符加倍时,也会出现这个愚蠢的无用错误消息:+

好:

\w+

不行:

\w++

评论

4赞 Sharcoux 3/17/2021
实际上,和chatacter的任意组合。+*
1赞 Tomáš Wróbel 9/5/2021
你保存了我的代码🤣。我有一个错别字.是的,非常无益的消息/(*\s*)/
0赞 Katie Byers 8/9/2022
@Sharcoux - 是的!我本来想用 a 替换 a,但最终两者都用了。谢谢!+*
4赞 Aneeq Ahmad 10/18/2020 #5

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

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}/

这个答案可能对那些遇到相同类型错误的人有所帮助,但从这个角度来看,他们和我一样犯错误的机会很大!干杯:)

评论

1赞 esqew 10/18/2020
你为什么不直接转义加号而不是完全移动它......?(\+)
0赞 Aneeq Ahmad 10/19/2020
谢谢你让我理解@esqew另一个,但我得到了另一个解决方案:)
2赞 Abraham 1/26/2021 #6

例如,我在 express node.js 中遇到过这个问题,当尝试为不以/internal

app.get(`\/(?!internal).*`, (req, res)=>{

经过长时间的尝试,当使用 RegExp 对象传递它时,它就可以工作了new RegExp()

app.get(new RegExp("\/(?!internal).*"), (req, res)=>{

如果您在路由中遇到此常见问题,这可能会有所帮助

评论

0赞 Uriel Alves 10/22/2022
伟大!!出于某种原因,做伎俩!THKS的new RegExp
4赞 David 2/24/2022 #7

如果正则表达式以 开始,也会发生这种情况。?

?可能用作量词 - 因此可能期望在它之前出现其他东西,因此“没有什么可重复的”错误。正则表达式字符串中没有任何东西在它之前,所以它无法量化任何东西;没有什么可重复的/没有什么可以量化的。?

?还有另一个作用 -- 如果前面有 它可能表示环视断言或其他特殊结构的开始。请参阅下面的示例。?(

如果忘记在以下 lookbehind 断言周围写括号,这将导致 OP 的错误:()?<=x

不對:const xThenFive = /?<=x5/;

正确:const xThenFive = /(?<=x)5/;

这是一个积极的回顾:我们正在寻找一个 5,它前面有一个,例如,它将匹配 in 而不是 in。/(?<=x)5/x5x5635x652