首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  正则表达式

利用递归匹配寻找函数体

  •  
  •   liangxiaowen · 100 天前 · 1149 次点击
    这是一个创建于 100 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

    我在尝试利用 python 正则表达式解析 java 文件。

    目前遇到的问题

    因为函数体中可能出现多重{},因此采用 python 的 regex。 regex.findall(r'{(?>[^{}]|(?R))}',java_file)

        public void fun(int n) {
            if(n > 1) {
                if (n == 2) {
                  n = 3;  
                }
            }
        }
    

    确实能匹配到

     {
            if(n > 1) {
                if (n == 2) {
                  n = 3;  
                }
            }
        }
    

    可我需要前面的public 和函数名fun。 在使用 public.*?{(?>[^{}]|(?R))}时,没能匹配到。

    甚至使用 public{(?>[^{}]|(?R))}去匹配

        public{
            ...
        }
    

    仍然不能匹配到。

    在递归匹配式前后加东西如何实现 我对递归匹配不是很熟悉,希望***指点一下***。

    8 回复  |  直到 2019-08-28 10:48:50 +08:00
        1
    thedrwu   100 天前 via Android
    regex 从简单的慢慢调。
    然而上下文无关的语法已经超出了正则的表达,加上递归也是有限的(比如注释里、字符串里有不对称的括号)。
        2
    momocraft   100 天前
    对自己好一点 学点形式语言的知识吧
        3
    Buges   100 天前 via Android
    我想到的思路就是,既然你解析 java 源文件,那就像 java 一样解析。
    比如先把注释忽略,执行转义,提取字符串等等。
    实在不行就去看看 jdk 源码里对语意是如何处理的。
        4
    liangxiaowen   100 天前
    @thedrwu 注释已经有工具解决了。
        5
    GeruzoniAnsasu   100 天前 via Android
    用正则去匹配编程语言的结构明显是编译原理完全没看过的思路

    建议从递归下降这个词开始搜
        6
    liangxiaowen   100 天前
    语法树的分析应该更适合我,虽然会比正则匹配更复杂。
        7
    ipwx   100 天前 via Android
    请使用 pyparsing 这个库,而且 Java 很可能有 user contributed example
        8
    aguesuka   100 天前 via Android
    上下文无关法则可以表达正则不能表达的语法。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3324 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 18ms · UTC 04:50 · PVG 12:50 · LAX 20:50 · JFK 23:50
    ♥ Do have faith in what you're doing.