正则表达式 - 如果在括号内,则不匹配

时间:2015-08-05 18:16:48

标签: javascript python regex

我试图解析javascript文件以获取require函数所需的所有文件,但我想确保这些文件不在一个封闭的块中

简单地解析require次来电,这就是我所做的

regex = re.compile(
    r"require\([\'\"](?P<filename>\.{1,2}.*?)(?:\.jsx?)?[\'\"]\)",
    re.M | re.I)

那么如何在块中丢弃require?例如,如果我有:

var test = require("./test");
{
  var test2 = require("./test2");
}

我会./test而不是./test2

我可以天真地尝试用require打开支架,但我的正则表达式似乎不起作用,它仍然与我不想要的那些相匹配< / p>

(?<!{)[^{]*?require\([\'\"](?P<filename>\.{1,2}.*?)(?:\.jsx?)?[\'\"]\)

谢谢!

2 个答案:

答案 0 :(得分:1)

既然你坚持,我创建了一个正则表达式来完成这项工作:

Ruby版本(in action):

Cannot set property assoTikArray of undefined

如您所见,这是完全不可读的。您应该循环遍历代码并保持开头(/(?<balanced_brackets>(?<no_brackets>[^{}]*)|\g<no_brackets>(?:\{\g<balanced_brackets>\}\g<no_brackets>)+){0}require\((?:"[^"]+"|'[^']+')\)(?!\g<balanced_brackets>}\g<balanced_brackets>\z)/x )和结束({)括号的计数,并且仅当前面有相同数量的两个时才接受匹配。

答案 1 :(得分:1)

我建议尝试使用正则表达式。对你来说这将是一个巨大的麻烦。而是在考虑KISS原则的情况下处理文件:

depth = 0 #To count nested blocks
word = "" #To keep track of the code we find before delving into another block
resultString = "" #To keep track of all code in the outermost block
inputJS = "var test = require(\"./test\");\n{\nvar test2 = require(\"./test2\");\n}\n" #input string
for i in inputJS: #Loop through one letter at a time
    if i == "{": #If it is an opening brace then increase depth
        resultString += word
        depth += 1
        word = ""
    elif i == "}": #If it is a closing brace decrease depth
        depth-=1
    elif depth == 0: #If we are at the top scope then keep track of the character
        word += i

#Parse resultString Normally

注意:这是一般块解析算法(正如您可能知道的那样)。这仅用于拾取不在块中的单词。另请注意,我认为大括号是平衡的。

希望这会有所帮助:)