Javascript Regex测试相同的字符串但得到不同的结果

时间:2019-09-20 05:56:01

标签: javascript regex

我的情况很奇怪。我正在使用正则表达式测试一些字符串。我想将它们密封在一个类中,如下所示:

export class RegexPattern {
  static price = (/^\d*(\.\d{1,2})?$/g);
  static phone = (/^([0-9]{0,5}-)?[0-9]{10}$/g);
}

所以可以说输入为'32'

但是当我用它两次测试相同的字符串时,第一次会通过,第二次会失败,例如:

RegexPattern.price.test('32')  //return ture
RegexPattern.price.test('32')  // return false

但是,如果我使用裸Regex而不密封的话:

(/^\d*(\.\d{1,2})?$/g).test('32')  //return ture
(/^\d*(\.\d{1,2})?$/g).test('32')  // return true

我的问题是为什么会这样?

1 个答案:

答案 0 :(得分:2)

RegExp对象跟踪lastIndex发生匹配的位置,因此在后续匹配中,它将从最后使用的索引开始,而不是0。

如果您不想在每次测试后将lastIndex手动重置为0,只需删除g标志即可。

单独测试正则表达式时,实际上是在每次调用时都创建一个新的正则表达式对象,因此起作用。如果您正在这样做:

'use strict';

const regex = /^\d*(\.\d{1,2})?$/g;

console.log(regex.test(32));
console.log(regex.test(32));

您也会获得truefalse