gpt4 book ai didi

javascript - 是否可以匹配 a/g Javascript 正则表达式其余部分的开头?

转载 作者:太空宇宙 更新时间:2023-11-04 15:37:54 25 4
gpt4 key购买 nike

我正在构建一个解析状态机,它使用一些轻型正则表达式来检测某些标记。我希望能够查看大字符串中的任意位置,并确定正则表达式是否严格从该位置开始匹配。我正在解析的字符串可能是任意大,并且我可能会针对大量字符测试此正则表达式,因此从该位置获取字符串的一部分并与 ^ 匹配非全局正则表达式是效率极低(我认为?)

我希望能够做的是这样的:

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 *用力挥手*

关于javascript - 是否可以匹配 a/g Javascript 正则表达式其余部分的开头?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44148927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com