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

q43xntqr  于 2023-02-25  发布在  Java
关注(0)|答案(7)|浏览(736)

我刚开始使用Regex,我正尝试将它融入我的一个新项目中,看看我是否可以学习它,并将它添加到我的技能库中。
我尝试使用.search函数来查看用户的输入是否包含非法字符,如下所示:

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

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

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

]/: Nothing to repeat

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

lpwwtiir

lpwwtiir1#

你需要将用于转义正则表达式特殊字符的反斜杠加倍。然而,正如@Bohemian指出的,大多数反斜杠都是不需要的。不幸的是,他的答案和你的答案有着同样的问题。你实际上想要的是:
反斜杠由读取字符串的代码解释,而不是传递给正则表达式分析器。

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

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

wgxvkvu9

wgxvkvu92#

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

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

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

elcex8rz

elcex8rz3#

对于Google旅行者:当您输入错误并将+ regex运算符加倍时,也会出现这种愚蠢的无用错误消息:
好吧:

\w+

不好:

\w++
1mrurvl1

1mrurvl14#

首先,在字符类[...] * 中,大多数 * 字符不需要转义--它们只是字面量。
因此,您的正则表达式应该是:

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

这对我来说很合适。

bis0qfac

bis0qfac5#

嗯,在我的例子中,我不得不在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}/
  • 这个答案可能对那些有帮助,谁得到了相同类型的错误,但他们的机会从这个Angular 得到的错误,因为我的!干杯:)*
zkure5ic

zkure5ic6#

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

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

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

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

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

bvpmtnay

bvpmtnay7#

如果正则表达式以?开始,也会发生这种情况。
?可能充当一个量词--因此?可能期望在它之前出现其他内容,从而出现“nothing to repeat”错误。在正则表达式字符串中,它之前没有任何内容,因此它不能量化任何内容;没有什么可重复的/没有什么可量化的。
?还有另一个作用--如果?前面是(,它可能表示lookaround assertion或其他一些特殊结构的开始。
如果忘记在后面的lookbehindAssert?<=x两边加上()括号,将导致OP错误:
错误:const xThenFive = /?<=x5/;
正确:const xThenFive = /(?<=x)5/;
这个/(?<=x)5/是一个正向后看:我们正在查找前面带有x的5,例如,它将匹配x563中的5,但不匹配x652中的5

相关问题