Javascript RegEx惰性匹配

我正在尝试使用以下正则表达式方式在JavaScript代码中查找循环模式,并替换语法(从:到in),


var str="for(var x in []) for(var y in [])";


str.replace( new RegExp( '(for\\s*\\(.+\\s+):(\\s+.+\\))', 'ig' ), "\$1in\$2" )

IE


for(var x : list)

{

 // something

}


for(var x in list)

{

 // something

}

但是,当同一行中有多个for循环时,我会遇到问题。


for(var x : list) { for(var y : list) {

     // something

 }

}

这是有效的语法,但是由于贪婪的正则表达式方法,其转换如下:


for(var x : list) { for(var y in list) {

         // something

 }

}

我试图探索懒惰的正则表达式语法,但无法使其正常工作。我怎样才能做到这一点?


郎朗坤
浏览 192回答 3
3回答

qq_遁去的一_1

您可以为全部*和添加一些惰性量词+。并for由于匹配而将其作为替换的一部分。var str = "for(var x : []) for(var y : [])";console.log(str.replace(/for\s*?(\(.+?\s+?):(\s+?.+?\))/ig, "for $1in$2"));短一点,它包括for在第一组中。var str = "for(var x : []) for(var y : [])";console.log(str.replace(/(for\s*?\(.+?):(.+?\))/ig, "$1in$2"));

倚天杖

除了使用懒惰的量词,您还可以使用取反的字符集,因为它们的效果更好,并且可以使用此正则表达式,(for\s*\([^:]+):([^)]+\))并替换为$1 in $2另外,您不必使用它,.+\\s+因为这是多余的,您可以编写.+?,甚至可以更好地使用否定字符集,以使其更快地工作,并且类似地:可以在编写后使用\\s+.+,.+?但是再次使用否定字符类是更好的选择,就像我提到的那样在我的回答中。这可能导致你进入问题的另一点是,你不应该使用这个\$1in\$2更换,而是使用$1 in $2首先你不需要逃避$的\$,其次,因为如果你的for循环是这样的,for(var x:list)即不必冒号和周围之间的空间变量,那么您可能获得的替换输出for(var xinlist)将使其无效。这就是为什么我在回答上述建议,以取代$1 in $2使in在其两侧的空间。正则表达式演示JS代码,const s = `for(var x : list){ // something}for(var x : list) { for(var y : list) {     // something }}`console.log(s.replace(/(for\s*\([^:]+):([^)]+\))/g, '$1 in $2'))

aluckdog

可以使用“?后”量词来实现懒惰行为。const str = "for(var x : list) { for(var y : list) {" str.replace( new RegExp( '(for\\s*?\\(.+?\\s+?):(\\s+.+\\))', 'ig' ), "\$1in\$2" )顺便提一句。JavaScript RegEx文字更容易阅读:str.replace( /(for\s*?\(.+?\s+?):(\s+.+\))/ig, "\$1in\$2" )
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript