在javascript中从字符串索引开始正则表达式匹配

在javascript中从字符串索引开始正则表达式匹配,javascript,regex,string,Javascript,Regex,String,我有一个字符串,我想对它进行正则表达式匹配。但很多时候,我对开头不感兴趣,因为我已经手动解析了字符串的一部分。所以我想从不同的索引开始正则表达式匹配,这样我就可以排除部分字符串,避免已经解析的匹配。因此,一次可以来自myString[0],另一次来自myString[51],依此类推 有没有办法有效地做到这一点?我正在解析数十万行代码,并希望以尽可能便宜的方式完成这项工作 如果没有其他方法,我的第一个建议是用子字符串去掉第一部分 let myString = "Hello world!"; le

我有一个字符串,我想对它进行正则表达式匹配。但很多时候,我对开头不感兴趣,因为我已经手动解析了字符串的一部分。所以我想从不同的索引开始正则表达式匹配,这样我就可以排除部分字符串,避免已经解析的匹配。因此,一次可以来自myString[0],另一次来自myString[51],依此类推

有没有办法有效地做到这一点?我正在解析数十万行代码,并希望以尽可能便宜的方式完成这项工作

如果没有其他方法,我的第一个建议是用子字符串去掉第一部分

let myString = "Hello world!";
let subbed = str.substring(3, myString.length);
let result = myRegex.exec(subbed);
但这似乎是一个相当昂贵的操作


没有这样的正则表达式操作:
result=myRegex.execFromIndex(51,myString)

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

它比substring方法更有效,因为它不需要创建额外的变量,并且设置lastIndex属性可能比使用substring更快。其他一切都和你做的一模一样

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

var result1Elem=document.getElementById('result1');
var result2Elem=document.getElementById('result2');
var runBtn=document.getElementById('runBtn');
runBtn.addEventListener(“单击”,运行测试);
函数runTest(){
var substrStart=+document.getElementById('substrStartText').value
var myRegex1=newregexp(document.getElementById('regextextext')。value'g');
myRegex1.lastIndex=substrStart;
var myRegex2=newregexp(document.getElementById('regextextext')。value'g');
var myString1=document.getElementById('testText').value;
var myString2=myString1.substring(3);
var结果;
var安全=0;
while((result=myRegex1.exec(myString1))!==null){
result1Elem.innerHTML+='
  • '+result[0]+'at'+result.index+'
  • '; 如果(安全+++>50)中断; } 安全系数=0; while((result=myRegex2.exec(myString2))!==null){ result2Elem.innerHTML++='
  • '+result[0]+'位于'+(result.index+substrStart)+'
  • '; 如果(安全+++>50)中断; } }
    
    试验
    正则表达式
    子串启动
    跑
    lastIndex=3的正则表达式的结果
    字符串子字符串的结果
    

        typo
        myString.length
        如果您确实关心效率,请尝试不使用regex。构造regex实例,然后设置其
        .lastIndex
        属性@你有什么建议?我很确定我自己写的搜索不会比正则表达式更有效。如果你能提供逻辑,决定只从某个索引搜索,这个问题可能会得到更好的答案。谢谢,但这不是我需要的,因为我在行的开头没有做任何正则表达式匹配,最后一个索引将是0我有点困惑到底出了什么问题。从索引51执行子字符串并将lastIndex设置为51将产生相同的结果是的,但它有效吗?因为我正在解析数十万行代码,所以我需要它的速度和内存效率。我的问题是,是否有比使用substring.this更好的替代方法。这是一个非常有效的问题,几乎没有任何赞成票,这似乎是一个非常好的答案,但问问题的人不承认这一点?我的问题是,如果
        lastIndex
        是标准化的?但似乎确实是这样:哇,感谢@StijndeWitt在这么多年后把我的注意力转移到这个问题上!看到我的初学者评论有点畏缩:)我相信答案中的regex示例将解析整个字符串输入,然后将lastIndex移动到起始位置,但我的目标是在开始之前不必解析该部分以节省一些性能。当使用子字符串时,它将创建字符串的副本,这也会降低性能。仅供参考,我现在使用Rust,在这里我有完全的控制权,可以使用字符串切片访问字符串的任何部分,这是零拷贝:)