Javascript RegEx惰性匹配

时间:2019-05-03 08:01:01

标签: javascript regex regex-greedy

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

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

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

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
 }
}

我试图探索懒惰的正则表达式语法,但无法使其正常工作。我该如何实现?

3 个答案:

答案 0 :(得分: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"));

答案 1 :(得分:1)

您可以使用否定字符集,而不是使用惰性量词,因为它们的性能更好,并且可以使用此正则表达式,

(for\s*\([^:]+):([^)]+\))

并替换为

$1 in $2

此外,您不必使用.+\\s+,因为这是多余的,您可以编写.+?,甚至更好地使用否定字符集,以使其运行更快,并且在{{之后1}}可以将:写为\\s+.+,但是像我在答案中提到的那样,否定字符类还是更好的选择。

可能导致您遇到问题的另一点是,您不应使用此.+?进行替换,而应首先使用\$1in\$2,而不必像{{ 1}},其次,因为如果您的for循环像$1 in $2这样,即冒号和周围的变量之间没有空格,那么您可能得到的替换输出为$,这将使其无效。这就是为什么我在上面的答案中建议用\$代替,以便for(var x:list)两侧都有空格。

Regex Demo

JS代码

for(var xinlist)

答案 2 :(得分:0)

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

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