我试图解析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?)?[\'\"]\)
谢谢!
答案 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
注意:这是不一般块解析算法(正如您可能知道的那样)。这仅用于拾取不在块中的单词。另请注意,我认为大括号是平衡的。
希望这会有所帮助:)