我试图在一个文件中匹配两个不同的文本模式并合并它们的结果。具体来说,我想通过将事件映射到其处理程序来了解其结构的源代码,例如:
@EventHandler(MyEvent)
class MyHandler {
...
所以结果是MyEvent -> MyHandler
.对于类似的事情来说,这很容易做到(?<=@EventHandler\()[^)]+\)\n.+?Handler
。但是,可能会发生多个事件:
@EventHandler(MyEvent, MyOtherEvent)
class MyHandler {
...
也可以分成多行:
@EventHandler(
MyEvent,
MyOtherEvent,
)
class MyHandler {
...
最后两个例子应该产生
MyEvent -> MyHandler
MyOtherEvent -> MyHandler
虽然我可以获得这样的匹配:
MyEvent,
MyOtherEvent,
)
class MyHandler
我不知道如何将这两部分结合起来。
如果仅使用正则表达式这样做不明智,我愿意接受其他解决方案,但我更喜欢 CLI 工具。 “正确”的事情可能是使用编程语言的反射机制,但我认为我不需要那么复杂。您可以假设所有事件的名称都以 结尾Event
,所有处理程序的名称都以 结尾Handler
,并且注释和类定义直接紧随其后。
答案1
你可以这样做:
perl -l -0777ne '
while (/\@EventHandler\(([^)]+)\)\s+class\s+(\w+)/g) {
$class = $2;
print "$_ -> $class" for $1 =~ /\w+/g
}' < your-file