如何输出正则表达式匹配多对一的组合?

如何输出正则表达式匹配多对一的组合?

我试图在一个文件中匹配两个不同的文本模式并合并它们的结果。具体来说,我想通过将事件映射到其处理程序来了解其结构的源代码,例如:

@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

相关内容