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 [重复]