正则表达式从Java源文件打印实现接口

时间:2017-10-02 16:21:19

标签: regex grep

我有一堆java源文件,想要列出源中每个类实现的接口。

最好的情况是在一行中声明一个类

class MyClass implements MyInterfaceA, MyInterfaceB {

但是,有多行声明的行

class SomeClass 
     implements
        InterfaceC,
        InterfaceD
        {

所以,基本上,如果我能有一个可以捕获第一个implements字符串文字和第一个字符{之间的所有内容的正则表达式,我就有了实现接口的名称。

在最后一个小时左右,我一直在修补像grep,pcregrep,sed和awk这样的工具,最后得到了一个似乎有用的命令。

pcregrep -M 'class[\s\S]*implements'

正如您所看到的,我正在尝试输出单词classimplements之间的所有内容,并且命令输出行

class SomeClass 
     implements

当我修改同一个表达式以输出implements{之间的所有内容时,它输出的内容远远超出我的要求,可能是因为文件中有这么多{和/或因为{是一个特殊字符。

如何在此之后输出第一个implements和第一个{之间的文字?

1 个答案:

答案 0 :(得分:1)

使用GNU grep

示例input.java文件:

class MyClass implements MyInterfaceA, MyInterfaceB {
}
class SomeClass 
     implements
        InterfaceC,
        InterfaceD
        {
}

工作:

my_interfaces=$(grep -Poz '\bimplements[[:space:]]*\K[^{]*(?=\{)' input.java | tr -s '\n' ' ')
echo "$my_interfaces"

输出:

MyInterfaceA, MyInterfaceB InterfaceC, InterfaceD