Javascript + Regex = 没有重复的错误?

Posted

技术标签:

【中文标题】Javascript + Regex = 没有重复的错误?【英文标题】:Javascript + Regex = Nothing to repeat error? 【发布时间】:2011-09-11 09:42:11 【问题描述】:

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

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

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

但是,当我尝试执行包含此行的函数时,它会针对该特定行引发以下错误:

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

]/: Nothing to repeat

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

【问题讨论】:

【参考方案1】:

对于 Google 旅行者:当您输入拼写错误并将 + 正则表达式运算符翻倍时,也会显示此愚蠢无用的错误消息:

好的:

\w+

不好:

\w++

【讨论】:

+* 的任意组合实际上是聊天者。 你保存了我的代码?。我有一个错字/(*\s*)/。是的,非常无益的消息【参考方案2】:

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

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

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

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

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

【讨论】:

【参考方案3】:

好吧,就我而言,我必须借助正则表达式测试电话号码,但我遇到了同样的错误,

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/

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

【讨论】:

为什么不直接转义加号而不是完全移动它...? (\+) 感谢您让我理解@esqew 另一个,但我得到了另一个解决方案:)【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

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

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

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

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

【讨论】:

顺便说一句,四倍 \ 仅在某些语言中需要;例如 java 是,perl 不是 我也遇到过类似的尴尬时刻。提醒一下,反斜杠首先由语言语法解释,然后由 RegExp 解释。 我只想提一下,javascript str.search 方法的一些解释似乎是引号之间的字符串是纯字符串,例如str.search("hello") 所以有人可能会认为如果想要的字符串只是例如星号,正确的语法是 str.search("*") 导致相同的错误“没有重复”。正确的是 str.search("\*")【参考方案6】:

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

所以,你的正则表达式应该是:

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

这是为我编译的。

【讨论】:

@Icet 其他答案对您不起作用吗?如果不是,什么输入是“不工作”? 例如 +44 作为输入无效。此解决方案工作正常 str.replace(/[\-[]\/\\()*\+\?\.\\\^\$\|]/g, "\\$&");

以上是关于Javascript + Regex = 没有重复的错误?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript / regex:删除字符串中括号之间的文本[重复]

为啥我的javascript regex.test() 会给出交替结果[重复]

用于匹配正整数和负整数的 Javascript RegEx [重复]

构建正则表达式(RegEx)以提取 HTML 标记的文本 [重复]

Javascript RegEx 匹配没有前后连字符的单词

Regex-如何防止重复的特殊字符?