JS RegExp:如何匹配" for(...)"但不是"因为......的#34;或者" for ... in"

时间:2018-02-22 04:35:39

标签: javascript regex for-loop

任何人都可以指导我一个正确的方向,以便成功匹配标准for循环,而不是for...offor...in变体吗?任何帮助都会非常感激。

背景故事&到目前为止我已经尝试过了(并且提前抱歉):我有一个用JavaScript编写的编码应用程序,我现在需要找出用户代码何时包含循环,但是,我需要区分forfor...of以及for...in。我原来的RegExp没有考虑到这一点。我有:

// match any loop
const re = new RegExp(/(?:\bwhile|\bfor)\s*?\(.*?\)/)

这似乎是为了我的目的,直到我意识到这也匹配for...offor...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...infor...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,然后只有在ofin之后没有跟随任何字符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...offor...in之类的循环导致问题因此需要

2 个答案:

答案 0 :(得分:2)

您无法使用正则表达式执行此操作。它们无法正确匹配任意嵌套的javascript表达式。改为使用正确的JS解析器,然后操纵AST。

  

目的是仅在代码实际包含可能无限的循环

时应用循环保护

你错了,for … infor … of循环不可能是无限的。

答案 1 :(得分:0)

感谢您提出这个问题的答案。它让我重新审视问题的根源,即将循环保护应用于没有循环的代码导致问题。在重新审视之后,我能够解决根本问题(在几周之后无法解决),所以欣赏正确方向的推动。