我正在尝试使用以下正则表达式方式在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
}
}
我试图探索懒惰的正则表达式语法,但无法使其正常工作。我该如何实现?
答案 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)
两侧都有空格。
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" )