Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.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 为什么这个regexp返回匹配?_Javascript_Node.js - Fatal编程技术网

Javascript 为什么这个regexp返回匹配?

Javascript 为什么这个regexp返回匹配?,javascript,node.js,Javascript,Node.js,只有在字符串中没有单词“managed”时,我才想匹配regexp-我怎么能做到这一点?负面外观头很奇怪。你需要匹配的不仅仅是你要找的词。我知道这很奇怪 var reg = /^(?!.*managed).+\.coffee$/ 编辑:我似乎真的被一些人的“怪异”描述和俗套描述蒙蔽了。这很奇怪,因为在表面上,“消极前瞻”一词意味着“前瞻并确保括号中的内容不在上面,然后回来继续匹配”。作为一个正则表达式的爱好者,我仍然认为这个命名很奇怪,特别是对于断言的第一次用户。对我来说,它更容易被认为是一


只有在字符串中没有单词“managed”时,我才想匹配regexp-我怎么能做到这一点?

负面外观头很奇怪。你需要匹配的不仅仅是你要找的词。我知道这很奇怪

var reg = /^(?!.*managed).+\.coffee$/

编辑:我似乎真的被一些人的“怪异”描述和俗套描述蒙蔽了。这很奇怪,因为在表面上,“消极前瞻”一词意味着“前瞻并确保括号中的内容不在上面,然后回来继续匹配”。作为一个正则表达式的爱好者,我仍然认为这个命名很奇怪,特别是对于断言的第一次用户。对我来说,它更容易被认为是一个“非”操作符,而不是一个真正向前爬行和“向前看”的操作符。为了使行为类似于实际的“前瞻”,您必须匹配搜索词之前的所有内容,因此
*

更简单的解决方案是删除字符串(^)断言的开头。同样,对我来说,阅读
更容易为“非”


虽然@RyanWheale的解决方案是正确的,但解释是不正确的。本质上是因为包含单词“managed”(例如“test managed”)的字符串可以算作而不是“managed”。要了解这一点,首先让我们看看正则表达式:

/^(?!managed).+\.coffee$/ 

// (Not "managed")(one or more characters)(".")("coffee")
因此,首先我们不能有一个文本为“managed”的字符串,然后我们可以有一个或多个字符,然后是一个点,后面是文本“coffee”。下面是一个实现这一点的示例

“你好,咖啡”[传]

有道理,
“Hello”
当然不是
“托管的”
。下面是另一个使用字符串的示例:

“20150212214712测试管理。咖啡”[通过]

为什么??因为“20150212214712测试管理”不是字符串“管理”,即使它包含字符串,计算机也不知道这是什么意思。它认为“20150212214712测试管理”作为一个字符串不是“管理”的,就像“andflaksfj”不是“管理”的一样。因此,它失败的唯一方式是如果“managed”位于字符串的开头:

“托管。咖啡”[失败]

这不仅仅是因为文本“managed”存在。假设计算机说
“管理的”。
不是
“管理的”
。它确实会通过
(?!managed)
部分,但是字符串的其余部分将只是
咖啡
,它将失败,因为没有

最后,另一个答案给出了解决方案:

/^(?!.*managed).+\.coffee$/
现在字符串“20150212214712 test managed.coffee”失败了,因为不管如何看,“test managed”、“-managed”、“st managed”等仍然会被视为
(?!*managed)
,并且失败。在上面的例子中,它可以尝试从
“.coffee”
添加一个子字符串,但正如所解释的,这将导致该字符串在regexp的其余部分失败(
+\.coffee$


希望这个冗长的解释能解释负面表情并不奇怪,只是从字面上理解了你的请求。

它必须是一个regexp吗?
'20150212214712-test-managed.coffee'.indexOf('matched')==-1
就足够了吗?负面外观头部并不“怪异”。对所发生的事情有一个非常简单的解释,但“奇怪”不是吗?不是说你需要测试的不仅仅是单词,也不是“奇怪”。例如,如果您有
(?!managed.*)
,它也不会工作。这是因为单词前面的项目,计算机会认为中带有文本“managed”的字符串与文本
“managed”
不同,它会通过。例如
“-managed”!=“托管”
使其正常工作,或
“测试托管”!=“托管”
。如果字符串以单词
“managed”
开头,则可以正常工作,因为计算机无法以任何其他方式对其进行解释。
/^(?!managed).+\.coffee$/ 

// (Not "managed")(one or more characters)(".")("coffee")
/^(?!.*managed).+\.coffee$/