gpt4 book ai didi

javascript - 从字符串中的给定索引开始的高效正则表达式匹配

转载 作者:行者123 更新时间:2023-11-30 15:34:47 24 4
gpt4 key购买 nike

我已经解析了一个字符串到索引idx。我的下一个解析步骤使用正则表达式。它需要匹配字符串的下一部分,即从 idx 位置开始。我如何有效地做到这一点?

例如:

let myString = "<p>ONE</p><p>TWO</p>"
let idx

// some code not shown here parses the first paragraph
// and updates idx
idx = 10

// next parse step must continue from idx
let myRegex = /<p>[^<]*<\/p>/
let subbed = myString.substring(idx)
let result = myRegex.exec(subbed)
console.log(result) // "<p>TWO</p>", not "<p>ONE</p>"

但是 myString.substring(idx) 似乎是一个相当昂贵的操作。

是否没有像这样的正则表达式操作:result = myRegex.execFromIndex(idx, myString);

一般来说,我想从不同的索引开始正则表达式匹配,这样我就可以排除部分字符串并避免已经解析的匹配。因此一次可以来自 myString[0] 另一次来自 myString[51] 等等。

有没有办法有效地做到这一点?我正在解析数十万行,并希望以尽可能便宜的方式执行此操作。

最佳答案

JavaScript 正则表达式有一个 lastIndex 属性,在 Regexp.exec() 中用作占位符,其中包含最后一次匹配的索引,表明它知道在哪里接下来开始因此设置 myRegex.lastIndex = 3 应该可以解决您的问题。

它比 substring 方法更有效,因为它不需要创建额外的变量并且设置 lastIndex 属性可能比执行 substring 操作更快。其他一切都与您所做的完全相同。

下面是一个测试,因为它表明设置 lastIndex 将产生与首先执行 substring 相同的结果。

var result1Elem = document.getElementById('result1');
var result2Elem = document.getElementById('result2');
var runBtn = document.getElementById('RunBtn');
runBtn.addEventListener("click", runTest);
function runTest() {
var substrStart = +document.getElementById('substrStartText').value
var myRegex1 = new RegExp(document.getElementById('regexText').value, 'g');
myRegex1.lastIndex = substrStart;
var myRegex2 = new RegExp(document.getElementById('regexText').value, 'g');

var myString1 = document.getElementById('testText').value;
var myString2 = myString1.substring(3);

var result;

var safety = 0;
while ((result = myRegex1.exec(myString1)) !== null) {
result1Elem.innerHTML += '<li>' + result[0] + ' at ' + result.index + '</li>';
if (safety++ > 50) break;
}

safety = 0;
while ((result = myRegex2.exec(myString2)) !== null) {
result2Elem.innerHTML += '<li>' + result[0] + ' at ' + (result.index + substrStart) + '</li>';
if (safety++ > 50) break;
}
}
<table>
<tr><td>Test </td><td> <input type="text" value="Hello World" id="testText" /></td></tr>
<tr><td>Regex </td><td> <input type="text" value="l." id="regexText" /></td></tr>
<tr><td>Substring Start </td><td> <input type="text" value="3" id="substrStartText" /></td></tr>
<tr><td colspan="2"><button id="RunBtn">Run</button></td></tr>
</table>

<table style="width:100%">
<tr style="font-weight:bold; background:#ccc">
<td>Results of Regex with lastIndex = 3</td>
<td>Results of string substringged</td>
</tr>
<tr>
<td><ul id="result1"></ul></td>
<td><ul id="result2"></ul></td>
</tr>
<table>

关于javascript - 从字符串中的给定索引开始的高效正则表达式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41723539/

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