【问题标题】:Regular expressions - unmatch if inside braces正则表达式 - 如果在大括号内则不匹配
【发布时间】:2015-10-28 16:02:02
【问题描述】:

我正在尝试解析一个 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,但我的正则表达式似乎不起作用,它仍然匹配我不想要的那些

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

谢谢!

【问题讨论】:

  • 您是否坚持仅使用正则表达式来完成此操作。不是不可能,只是保证不可读。
  • 是的 -.- 如果可能的话。这是我唯一需要做的解析,我认为使用解析库不值得哈哈
  • 我不是说解析库,只是循环计算{}的个数。
  • 您能详细说明一下吗?

标签: javascript python regex


【解决方案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

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

希望这会有所帮助:)

【讨论】:

    【解决方案2】:

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

    Ruby 版本 (in action):

    /(?<balanced_brackets>(?<no_brackets>[^{}]*)|\g<no_brackets>(?:\{\g<balanced_brackets>\}\g<no_brackets>)+){0}require\((?:"[^"]+"|'[^']+')\)(?!\g<balanced_brackets>}\g<balanced_brackets>\z)/x
    

    如您所见,这是完全不可读的。相反,您应该循环遍历代码并计算开始({) 和结束(}) 括号的数量,并且仅当它前面有相同数量的两个括号时才接受匹配。

    【讨论】:

    • 我的答案中的方法和您在此处建议的方法的缺点是代码中的字符串中是否出现了任何带注释的大括号/大括号。
    • 还有你是否在一个字符串中。虽然我相信正则表达式也会出现同样的问题。
    • python 版本有什么问题?
    • 我不确定如何将部分语法从 ruby​​ 翻译成 python 并且找不到哪一部分(因为正则表达式不可读)。解决方案不是我回答的重点——重点是——不要使用正则表达式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 2011-07-18
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多