我的情况很奇怪。我正在使用正则表达式测试一些字符串。我想将它们密封在一个类中,如下所示:
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
我的问题是为什么会这样?
答案 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));
您也会获得true
,false
。