Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript正则表达式惰性匹配_Javascript_Regex_Regex Greedy - Fatal编程技术网

Javascript正则表达式惰性匹配

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

我试图在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 : 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