我在尝试利用 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{
...
}
仍然不能匹配到。
在递归匹配式前后加东西如何实现 我对递归匹配不是很熟悉,希望***指点一下***。
1
thedrwu 2019-08-27 21:46:33 +08:00 via Android
regex 从简单的慢慢调。
然而上下文无关的语法已经超出了正则的表达,加上递归也是有限的(比如注释里、字符串里有不对称的括号)。 |
2
momocraft 2019-08-27 21:48:56 +08:00
对自己好一点 学点形式语言的知识吧
|
3
Buges 2019-08-27 21:50:04 +08:00 via Android
我想到的思路就是,既然你解析 java 源文件,那就像 java 一样解析。
比如先把注释忽略,执行转义,提取字符串等等。 实在不行就去看看 jdk 源码里对语意是如何处理的。 |
4
liangxiaowen OP @thedrwu 注释已经有工具解决了。
|
5
GeruzoniAnsasu 2019-08-27 21:59:56 +08:00 via Android
用正则去匹配编程语言的结构明显是编译原理完全没看过的思路
建议从递归下降这个词开始搜 |
6
liangxiaowen OP 语法树的分析应该更适合我,虽然会比正则匹配更复杂。
|
7
ipwx 2019-08-27 22:43:07 +08:00 via Android
请使用 pyparsing 这个库,而且 Java 很可能有 user contributed example
|
8
aguesuka 2019-08-28 10:48:50 +08:00 via Android
上下文无关法则可以表达正则不能表达的语法。
|