[英]Is it possible to match the start of the remainder of a /g Javascript regex?
我正在构建一个解析状态机,该状态机使用一些轻型正则表达式来检测某些令牌。 我希望能够查看大字符串中的任意位置,并确定正则表达式是否严格从该位置开始匹配。 我正在解析的字符串可能会很大,并且我可能会针对大量字符测试此正则表达式,因此从该位置获取字符串的一部分并针对^
匹配非全局正则表达式效率非常低(我认为吗?)
我想做的是这样的:
var longString = 'abc123defghi45jk...';
var numberRe = /\d+/g;
numberRe.lastIndex = 3;
var match = numberRe.exec(longString);
console.log(match);
并且仅当numberRe.lastIndex
位于与正则表达式匹配的子字符串上时,才使regex匹配,从而使numberRe.exec(longString.slice(numberRe.lastIndex))
的结果相同。
这可能吗?
sticky( y
)标志完全做到了这一点,并且最近使其成为了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
如果您要定位的引擎不受支持,则可以使用match的index
属性,并确保其与正则表达式lastIndex
的先前值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'));
(由于字符串优化¹,在现代引擎上重复进行切片可能不会变慢,但这还是更好。)
¹*大力挥手*
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.