繁体   English   中英

是否可以匹配/ g Java regex其余部分的开头?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM