我正在构建一个解析状态机,它使用一些轻型正则表达式来检测某些标记。我希望能够查看大字符串中的任意位置,并确定正则表达式是否严格从该位置开始匹配。我正在解析的字符串可能是任意大,并且我可能会针对大量字符测试此正则表达式,因此从该位置获取字符串的一部分并与 ^
匹配非全局正则表达式是效率极低(我认为?)
我希望能够做的是这样的:
var longString = 'abc123defghi45jk...';
var numberRe = /\d+/g;
numberRe.lastIndex = 3;
var match = numberRe.exec(longString);
console.log(match);
并且仅当 numberRe.lastIndex
位于与正则表达式匹配的子字符串上时才使正则表达式匹配,例如 numberRe.exec(longString.slice(numberRe .lastIndex))
会有相同的结果。
这可能吗?
sticky (y
) flag正是这样做的,并且最近将其纳入了 JavaScript 标准(它最初是 Mozilla 的扩展):
> var digit = /\d/y;
> digit.exec('12x3')
[ '1', index: 0, input: '12x3' ]
> digit.exec('12x3')
[ '2', index: 1, input: '12x3' ]
> digit.exec('12x3')
null
如果您的目标引擎不支持,则可以使用匹配的 index
属性,并确保它与正则表达式的 lastIndex
的先前值对齐>:
function stickyMatch(regex, string) {
var expectedIndex = regex.lastIndex;
var match = regex.exec(string);
if (!match || match.index !== expectedIndex) {
regex.lastIndex = 0;
return null;
}
return match;
}
var digit = /\d/g;
console.log(stickyMatch(digit, '12x3'));
console.log(stickyMatch(digit, '12x3'));
console.log(stickyMatch(digit, '12x3'));
(由于字符串优化,在现代引擎上重复切片可能不会慢,但无论如何这更好。)
1 *用力挥手*
我是一名优秀的程序员,十分优秀!