任何人都可以指导我一个正确的方向,以便成功匹配标准for
循环,而不是for...of
和for...in
变体吗?任何帮助都会非常感激。
背景故事&到目前为止我已经尝试过了(并且提前抱歉):我有一个用JavaScript编写的编码应用程序,我现在需要找出用户代码何时包含循环,但是,我需要区分for
和for...of
以及for...in
。我原来的RegExp没有考虑到这一点。我有:
// match any loop
const re = new RegExp(/(?:\bwhile|\bfor)\s*?\(.*?\)/)
这似乎是为了我的目的,直到我意识到这也匹配for...of
和for...in
(如果你对我为什么需要它感兴趣,请看到底部)
所以我一直在努力编写一个可行的正则表达式,但似乎无法得到它。请考虑以下带循环的模拟代码片段:
const loop1 = `
for (var i = 0; i< arr.length; i++) {
}`
const loop2 = `
for (var i of arr) {
}`
const loop3 = `
for (var i in arr) {
}`
我可以编写一个正则表达式,可以判断循环 是 for...in
或for...of
循环,但不是当一个 不是
例如,使用上面的循环片段:
const IS_FOR_OF = new RegExp(/(?:\bwhile|\bfor)\s*?\(.*?(?:\bof\b|\bin\b).*?\)/)
IS_FOR_OF.test(loop1) // false
IS_FOR_OF.test(loop2) // true
但是当我尝试做相反的操作时,即匹配开放的parens,然后只有在of
或in
之后没有跟随任何字符0或更多次,它不起作用:
const IS_NOT_FOR_OF = new RegExp(/(?:\bwhile|\bfor)\s*?\(.*?(?!\bof\b|\bin\b).*?\)/)
console.log(IS_NOT_FOR_OF.test(loop1)) // true
console.log(IS_NOT_FOR_OF.test(loop2)) // true
谢谢!
P.S。目的是仅在代码实际包含可能无限的循环时应用循环保护 - 将循环保护应用于没有循环的代码,或者具有for...of
和for...in
之类的循环导致问题因此需要
答案 0 :(得分:2)
您无法使用正则表达式执行此操作。它们无法正确匹配任意嵌套的javascript表达式。改为使用正确的JS解析器,然后操纵AST。
目的是仅在代码实际包含可能无限的循环
时应用循环保护
你错了,for … in
和for … of
循环不可能是无限的。
答案 1 :(得分:0)
感谢您提出这个问题的答案。它让我重新审视问题的根源,即将循环保护应用于没有循环的代码导致问题。在重新审视之后,我能够解决根本问题(在几周之后无法解决),所以欣赏正确方向的推动。