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$/