尝试将正则表达式应用于以下字符串
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” 和arrMatches [1]产生输出“idTwo”。
然而它正在返回
arrMatches[0] = Field "saveUserId" argument "idTwo" of type "String!" is required but not provided.
arrMatches[1] = "
答案 0 :(得分:1)
你有两个问题:
arrMatches[0]
包含完整匹配,可以从arrMatches[1]
到arrMatches[1+n]
您的捕获组只包含1个字符:您希望在组内包含量词,以避免仅捕获它匹配的最后一个字符;使用(.+)
代替(.)+
正如Wiktor Stribiżew提到的那样使用延迟量词将是一种优化,因为它可以避免回溯:没有它,.+
将尽可能多地匹配(到达字符串的末尾),然后回溯直到下一个令牌可以匹配,而使用.+?
时,将在每个字符.
匹配后测试下一个令牌。
请注意,这不是盲目应用的优化;我认为一个好的经验法则是估计匹配的结尾是否更接近文本的末尾,在这种情况下,回溯将更有效 - 或者到匹配的开始,在这种情况下,懒惰量词将更有效。这一切都归结为下一个令牌必须经过测试的时间。
如果您的字段保证不包含任何"
(转义或不转义),则可以使用否定字符类[^"]
代替.
进行更好的优化。将确保不会与封闭的报价相匹配。