Javascript正则表达式惰性匹配
我试图在javascript代码中找到for循环模式,并使用下面的正则表达式替换语法(from:to in)Javascript正则表达式惰性匹配,javascript,regex,regex-greedy,Javascript,Regex,Regex Greedy,我试图在javascript代码中找到for循环模式,并使用下面的正则表达式替换语法(from:to in) var str="for(var x in []) for(var y in [])"; str.replace( new RegExp( '(for\\s*\\(.+\\s+):(\\s+.+\\))', 'ig' ), "\$1in\$2" ) i、 e 与 但是,当同一行中有多个for循环时,我会遇到一些问题 for(var x : list) { for(var y : li
var str="for(var x in []) for(var y in [])";
str.replace( new RegExp( '(for\\s*\\(.+\\s+):(\\s+.+\\))', 'ig' ), "\$1in\$2" )
i、 e
与
但是,当同一行中有多个for循环时,我会遇到一些问题
for(var x : list) { for(var y : list) {
// something
}
}
这是有效的语法,但是由于贪婪的正则表达式方法,它转换如下:
for(var x : list) { for(var y in list) {
// something
}
}
我试图探索惰性正则表达式语法,但无法使其工作。如何实现这一点?懒惰行为可以通过在量词后面加一个
?
来实现
const str = "for(var x : list) { for(var y : list) {"
str.replace( new RegExp( '(for\\s*?\\(.+?\\s+?):(\\s+.+\\))', 'ig' ), "\$1in\$2" )
顺便说一句,JavaScript正则表达式文字更易于阅读:
str.replace( /(for\s*?\(.+?\s+?):(\s+.+\))/ig, "\$1in\$2" )
您可以向所有
*
和+
添加一些惰性量词。并将作为替换的一部分,因为匹配
var str=“for(var x:[])for(var y:[])”;
log(str.replace(/for\s*?(\(。+?\s+?):(\s+?。+?\))/ig,“for$1in$2”)代码>不使用惰性量词,您可以使用否定字符集,因为它们性能更好,您可以使用此正则表达式
(for\s*\([^:]+):([^)]+\))
换成,
$1 in $2
而且,您不必使用+\\s+
,因为这是多余的,相反,您可以只编写+?
,甚至更好地使用否定字符集,使其在之后工作得更快,同样地:
您可以将\\s+.+/code>编写为+?
,但正如我在我的文章中提到的,否定字符类是更好的选择回答
另一个可能导致问题的地方是,您不应该使用此\$1in\$2
进行替换,而是使用$1 in$2
首先,您不需要将$
作为\$
进行转义,其次,因为如果for循环是这样的,for(var x:list)
即冒号和周围变量之间没有空格,那么您可能得到的替换输出是(var xinlist)
,这将使其无效。这就是为什么我在上面的回答中建议将$2中的$1替换为,这样中的两边都有空间
JS代码
const s=`for(变量x:list)
{
//某物
}
for(varx:list){for(vary:list){
//某物
}
}`
log(s.replace(/(for\s*\([^::]+):([^]+\)/g,“$1 in$2”)
Regex不适合处理嵌套结构。我可以使它适用于当前场景,但当您有更多的嵌套模式时,它通常可能仍然会失败。您不能像str.split(':').join('in')那样执行它。
?或者您只想将其作为for循环的一部分?Icepickle,不,因为“:”的使用方式多种多样,例如for objects==>var objectA={'A'、'Apple'、'B':'Banana'}@我该怎么办?使用递归匹配?或者任何其他可能的方式?@Pratik:添加为请检查。写入+?\s+?
是多余的,可以只写入+?
,对于\s+.+?
“使用实现”什么?
(for\s*\([^:]+):([^)]+\))
$1 in $2