正则表达式的javascript字符串匹配未正确标记
正在尝试将正则表达式应用于以下字符串正则表达式的javascript字符串匹配未正确标记,javascript,regex,Javascript,Regex,正在尝试将正则表达式应用于以下字符串 Field "saveUserId" argument "idTwo" of type "String!" is required but not provided. 并提出了这样的RegExp模式 var rePattern = new RegExp(/Field (.)+ argument (.)+ of type (.)+ is required but not provided./); var arrMatches = e.message.matc
Field "saveUserId" argument "idTwo" of type "String!" is required but not provided.
并提出了这样的RegExp模式
var rePattern = new RegExp(/Field (.)+ argument (.)+ of type (.)+ is required but not provided./);
var arrMatches = e.message.match(rePattern);
console.log(arrMatches[0]);
console.log(arrMatches[1]);
我希望arrMatches[0]生成输出“saveUserId”
并匹配[1]以产生输出“idTwo”
然而,它正在回归
arrMatches[0] = Field "saveUserId" argument "idTwo" of type "String!" is required but not provided.
arrMatches[1] = "
你有两个问题:
arrmaches[0]
包含完整匹配项,可以从arrmaches[1]
到arrmaches[1+n]
(.+)
而不是(.+)
+
将尽可能匹配(到达字符串末尾),然后回溯直到下一个标记可以匹配,而使用+?
时,将在每个字符
匹配后测试下一个标记。请注意,这不是一个可以盲目应用的优化;我认为一个很好的经验法则是估计匹配的结尾是否更接近文本的结尾,在这种情况下回溯将更有效-或者在匹配的开始,在这种情况下惰性量词将更有效。这一切归结为下一个令牌需要测试的时间
如果您的字段保证不包含任何
“
(转义或非转义)的话,更好的优化方法是使用否定字符类[^”]
而不是
,这将确保不会比所附引号更匹配。将+
放在之后
内部()
,(.+)
。最好使用惰性的,(.+?)
。并使用arrmaches[1]
和arrmaches[2]
使用(.+)
而不是(.+)
访问值。重复捕获组时,只有最后一次匹配该组时才会被实际存储。@WiktorStribiżew您能确认我的解释是正确的吗?惰性量词仍然会导致类似回溯的情况,也称为“惰性模式扩展”(@nhahtdh告诉我)。因此,避免回溯并不是真正的主要区别。要点是,+?
将首先匹配1个符号,然后尝试下一个子模式,如果不匹配,+?
将获取2个符号,然后再次尝试下一个子模式,依此类推,直到匹配或不匹配为止。所以,在这里,我认为应该首选+?
惰性版本。@WiktorStribiżew感谢您的反馈,我编辑了我的答案,以提及回溯不应该总是被避免的。我添加了一条经验法则来评估您是最好使用懒惰量词还是回溯,进一步的反馈显然是受欢迎的。:)懒惰量词和贪婪量词都会影响性能。只要可能,尽量避免两者,或在它们不会造成伤害的情况下使用。我想在这里用。