正则表达式的javascript字符串匹配未正确标记

时间:2017-07-13 09:32:41

标签: 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.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] = "

1 个答案:

答案 0 :(得分:1)

你有两个问题:

  1. arrMatches[0]包含完整匹配,可以从arrMatches[1]arrMatches[1+n]

  2. 访问这些群组
  3. 您的捕获组只包含1个字符:您希望在组内包含量词,以避免仅捕获它匹配的最后一个字符;使用(.+)代替(.)+

  4. 正如Wiktor Stribiżew提到的那样使用延迟量词将是一种优化,因为它可以避免回溯:没有它,.+将尽可能多地匹配(到达字符串的末尾),然后回溯直到下一个令牌可以匹配,而使用.+?时,将在每个字符.匹配后测试下一个令牌。
    请注意,这不是盲目应用的优化;我认为一个好的经验法则是估计匹配的结尾是否更接近文本的末尾,在这种情况下,回溯将更有效 - 或者到匹配的开始,在这种情况下,懒惰量词将更有效。这一切都归结为下一个令牌必须经过测试的时间。

    如果您的字段保证不包含任何"(转义或不转义),则可以使用否定字符类[^"]代替.进行更好的优化。将确保不会与封闭的报价相匹配。