什么是“;无需重复“;在javascript中使用正则表达式时的错误平均值

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

本文关键字:正则表达式 错误 平均值 什么 javascript      更新时间:2023-09-26

我是Regex的新手,我正试图将其融入我的一个新项目中,看看我是否能学会它,并将其添加到我的技能代表中。然而,我遇到了一个障碍。

我正试图通过使用.search函数来查看用户的输入中是否包含非法字符,如下所示:

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

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

Uncaught SyntaxError: Invalid regular expression: /[[]?*+|{}'()@.
]/: Nothing to repeat

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

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

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

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

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

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

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

Regex文字很好,因为您不必转义转义符,而且一些IDE会突出显示无效的Regex(对我很有帮助,因为我经常把它们搞砸)。

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

好的:

'w+

不好:

'w++

如果正则表达式以?开头,也可能发生这种情况。

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

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

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

不正确:const xThenFive = /?<=x5/;

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

这个/(?<=x)5/是一个积极的后备:我们正在寻找一个前面有x的5,例如它将匹配x563中的5,但不匹配x652中的5

好吧,在我的情况下,我不得不在regex的帮助下测试一个电话号码,但我得到了同样的错误,

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

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

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

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

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

这是为我编译的。

例如,当我试图为不以/internal 开头的路径创建路由时,在express node.js中遇到了这个问题

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

经过长时间的尝试,当使用new RegExp() 将其作为RegExp对象传递时,它才起作用

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

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