为了账号安全,请及时绑定邮箱和手机立即绑定

Javascript RegEx惰性匹配

Javascript RegEx惰性匹配

郎朗坤 2021-05-09 16:39:21
我正在尝试使用以下正则表达式方式在JavaScript代码中查找循环模式,并替换语法(从:到in),var str="for(var x in []) for(var y in [])";str.replace( new RegExp( '(for\\s*\\(.+\\s+):(\\s+.+\\))', 'ig' ), "\$1in\$2" )IEfor(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 }}我试图探索懒惰的正则表达式语法,但无法使其正常工作。我怎样才能做到这一点?
查看完整描述

3 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

您可以为全部*和添加一些惰性量词+。并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"));


查看完整回答
反对 回复 2021-05-20
?
倚天杖

TA贡献1828条经验 获得超3个赞

除了使用懒惰的量词,您还可以使用取反的字符集,因为它们的效果更好,并且可以使用此正则表达式,

(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'))


查看完整回答
反对 回复 2021-05-20
?
aluckdog

TA贡献1847条经验 获得超7个赞

可以使用“?后”量词来实现懒惰行为。

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" )


查看完整回答
反对 回复 2021-05-20
  • 3 回答
  • 0 关注
  • 191 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信