![如何输出正则表达式匹配多对一的组合?](https://linux22.com/image/226866/%E5%A6%82%E4%BD%95%E8%BE%93%E5%87%BA%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%8C%B9%E9%85%8D%E5%A4%9A%E5%AF%B9%E4%B8%80%E7%9A%84%E7%BB%84%E5%90%88%EF%BC%9F.png)
我试图在一个文件中匹配两个不同的文本模式并合并它们的结果。具体来说,我想通过将事件映射到其处理程序来了解其结构的源代码,例如:
@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