我正在Java
编写一个简单的Python
源文件解析器。主要目标是提取方法声明列表。方法以public|private|protected
开头(我假设没有friendly
方法没有访问修饰符,这在我的代码库中是可接受的)并以{
结尾但不能包含{{ 1}}(可以是多行)。
所以我当前的;
模式如下:
regex
我不确定如何说整个匹配组不能包含((public|private|protected).*\n*.*?({|;))
所以我试图说给我一些以;
或{
结尾的内容,以先到者为准首先,不贪心。但是,这不起作用,这是一个失败的块:
;
您可以看到在方法声明之前有一个变量声明,它以private static final AtomicInteger refCount = new AtomicInteger(0);
protected int getSomeVar() {
开头但没有private
。所以这是作为一个匹配返回的,我希望将它作为两个匹配,然后我将在单独的非正则表达式逻辑中丢弃变量声明。但是,如果您知道如何在{
之前排除;
,那也可以。
基本上,我如何在Python正则表达式中告诉主模式中不能出现某个字符(或子模式)?
答案 0 :(得分:2)
您可以使用否定字符类来表示“除(换行符或左括号或分号)之外的任何字符”。
((public|private|protected)[^;{]*\n*[^;{]*?({|;))
答案 1 :(得分:1)
这终于奏效了:
((public|private|protected)[^;{]*?{)
请注意我必须指定在第一个{{/ p>}之前排除;
和{