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

利用递归匹配寻找函数体

  •  
  •   liangxiaowen · 2019-08-27 21:42:16 +08:00 · 3235 次点击
    这是一个创建于 1694 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

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

    建议从递归下降这个词开始搜
    liangxiaowen
        6
    liangxiaowen  
    OP
       2019-08-27 22:15:09 +08:00
    语法树的分析应该更适合我,虽然会比正则匹配更复杂。
    ipwx
        7
    ipwx  
       2019-08-27 22:43:07 +08:00 via Android
    请使用 pyparsing 这个库,而且 Java 很可能有 user contributed example
    aguesuka
        8
    aguesuka  
       2019-08-28 10:48:50 +08:00 via Android
    上下文无关法则可以表达正则不能表达的语法。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1002 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:46 · PVG 03:46 · LAX 12:46 · JFK 15:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.