【问题标题】:Same RegExp returns different results - the first tim correct result, second time null相同的正则表达式返回不同的结果——第一次正确的结果,第二次为空
【发布时间】:2015-06-12 15:02:34
【问题描述】:

我想弄清楚我在 javascript 中看到的一些奇怪的逻辑, 我有下一个代码:

var rgx = /(\S*)\s(\S*)/g;
rgx.exec("Yosi 1"); // returns ["Yosi 1","Yosi","1"]
rgx.exec("Yosi 1"); // returns null
rgx.exec("Yosi 1"); // returns ["Yosi 1","Yosi","1"]

为什么我第二次得到空值?我需要以某种方式重置 regexp 对象吗?

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    According to the documentation,每次使用g时,正则表达式对象的lastIndex属性都会更新。在第一次匹配之后,lastIndex 将位于字符串的末尾,因此当您将其与同一字符串进行比较时,它会开始在末尾查找匹配项,因此不会找到任何内容。

    您可以不使用g 或使用.match 或其他替代方法,具体取决于您的用例。

    【讨论】:

      【解决方案2】:

      写在MDN documentation那个

      如果匹配成功,exec()方法返回一个数组并更新 正则表达式对象的属性。

      所以,是的,您需要重新创建对象,或者,如果您只是在测试,请使用.search() 方法(因为test() 也会推进lastIndex 属性):

      如果您只是为了判断真假而执行匹配,请使用 RegExp.prototype.test() 方法或 String.prototype.search() 方法。

      如果你的正则表达式使用“g”标志,你可以使用 exec() 方法多次查找同一字符串中的连续匹配项。 当您这样做时,搜索从 str 指定的子字符串开始 正则表达式的 lastIndex 属性(test() 也会提前 lastIndex 属性)。

      或者,您可以通过将 .lastIndex property 设置为 0 来将 RegEx 对象“重新缠绕”到起始位置:

      var rgx = /(\S*)\s(\S*)/g;
      alert(rgx.exec("Yosi 1")); // returns ["Yosi 1","Yosi","1"]
      alert(rgx.exec("Yosi 1")); // returns null, and resets the object
      alert(rgx.exec("Yosi 1")); // returns ["Yosi 1","Yosi","1"]
      rgx.lastIndex = 0;         // reset it manually
      alert(rgx.exec("Yosi 1")); // returns ["Yosi 1","Yosi","1"] again

      【讨论】:

      • 将 lastIndex 设置为零是一种不好的做法吗?因为 match 不返回分组的匹配,所以它只返回 ['Yosi 1']?
      • 当您需要结果时,我认为这不是一个坏习惯。开发人员添加了“Writable --> yes”属性属性,恕我直言。
      猜你喜欢
      • 2022-06-10
      • 1970-01-01
      • 2017-11-08
      • 1970-01-01
      • 1970-01-01
      • 2017-11-22
      • 2013-12-26
      • 2012-10-15
      • 1970-01-01
      相关资源
      最近更新 更多