【发布时间】:2014-02-21 13:05:36
【问题描述】:
我有一个正则表达式,用全局集进行字符串替换。我只需要一个替换,但我使用的是全局的,因为有第二组模式匹配(一个确定替换开始时可接受的索引的数学方程)我不能轻易地表达为正则表达式的一部分。
var myString = //function-created string
myString = myString.replace(myRegex, function(){
if (/* this index is okay */){
//!! want to STOP searching now !!//
return //my return string
} else {
return arguments[0];
//return the string we matched (no change)
//continue on to the next match
}
}, "g");
如果可能的话,我该如何跳出字符串全局搜索?
谢谢
可能的解决方案
一种解决方案(出于性能原因,在我的场景中不起作用,因为我有非常大的字符串,其中有数千个可能匹配非常复杂的 RegExp 运行数百或数千次):
var matched = false;
var myString = //function-created string
myString = myString.replace(myRegex, function(){
if (!matched && /* this index is okay */){
matched = true;
//!! want to STOP searching now !!//
return //my return string
} else {
return arguments[0];
//return the string we matched (no change)
//continue on to the next match
}
}, "g");
【问题讨论】:
-
我不知何故错过了您的正则表达式以及简单的输入和预期输出示例
-
你能先
match他们,然后循环浏览这些吗? -
@Wrikken 从技术上讲这可能有效,但它会影响性能。我添加了一个可能的解决方案,它可以匹配所有内容(类似于您所说的),但是在我的场景中的性能影响非常苛刻。
-
@RandyHall:如果性能有问题,那么也许你需要重新考虑你这样做的方式。全局选项将匹配所有可能的匹配,这就是它的用途,没有办法提前退出。如果只需要匹配一次,请不要使用
g。所以也许你最好弄清楚为什么你觉得你需要g,以及是否有更好的方法来处理它。 -
如果您甚至想停止解析字符串的其余部分以进行匹配,您可以编写该解析器并用勺子喂它增加输入的部分,并在找到它时停止解析。或者您可以省略
g和 use the match.index 以从输入中删除匹配项,如果它们不符合您的数学检查,直到找到符合要求的匹配项。
标签: javascript regex replace global break