Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript+;Regex=无需重复错误?_Javascript_Regex_Match - Fatal编程技术网

Javascript+;Regex=无需重复错误?

Javascript+;Regex=无需重复错误?,javascript,regex,match,Javascript,Regex,Match,我是新加入Regex的,我正在尝试将它加入到我的一个新项目中,看看我是否可以学习它,并将其添加到我的技能报告中。然而,我在这里遇到了一个障碍 我试图通过使用.search功能查看用户输入的内容中是否包含非法字符,如下所示: if (name.search("[\[\]\?\*\+\|\{\}\\\(\)\@\.\n\r]") != -1) { ... } 但是,当我尝试执行包含该行的函数时,它会针对该特定行抛出以下错误: Uncaught SyntaxError: Invalid re

我是新加入Regex的,我正在尝试将它加入到我的一个新项目中,看看我是否可以学习它,并将其添加到我的技能报告中。然而,我在这里遇到了一个障碍

我试图通过使用
.search
功能查看用户输入的内容中是否包含非法字符,如下所示:

if (name.search("[\[\]\?\*\+\|\{\}\\\(\)\@\.\n\r]") != -1) {
    ...
}
但是,当我尝试执行包含该行的函数时,它会针对该特定行抛出以下错误:

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

]/: Nothing to repeat

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

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

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

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

这为我编译。

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

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

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

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

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

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

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

对于Google travelers:当你输入一个错别字并将
+
正则表达式操作符加倍时,也会出现这个愚蠢的错误消息:

好:

不好:

\w++

嗯,在我的例子中,我不得不在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}/

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

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

app.get(`\/(?!internal).*`, (req, res)=>{
经过长时间的尝试,当使用
newregexp()


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

顺便说一句,只有在某些LANG中才需要四个字符;例如java是的,perl notA同样遇到了我遇到的duh时刻。很高兴提醒您,反斜杠首先由语言语法解释,然后由RegExp解释。@Icet其他答案对您无效吗?如果不是,什么输入“不工作”?例如+44作为输入不工作。此解决方案在str.replace(/[\-[]\/\{\}()*\+\?\.\\\^\$\\\\\\\;;]/g,“\\$&”);你为什么不直接跳过加号,而不是完全移动它。。。?(
\+
)谢谢你让我理解@esqew另一个,但我得到了另一个解决方案:)任何
+
*
的组合。
app.get(`\/(?!internal).*`, (req, res)=>{
app.get(new RegExp("\/(?!internal).*"), (req, res)=>{