ファイル内の2つの異なるテキストパターンを一致させ、結果をマージしようとしています。特に、イベント構造のソースコードをハンドラにマッピングして理解したいと思います。たとえば、次のようになります。
@EventHandler(MyEvent)
class MyHandler {
...
MyEvent -> MyHandler
それで、そのようなことをするのはかなり簡単であることがわかりました(?<=@EventHandler\()[^)]+\)\n.+?Handler
。ただし、複数のイベントが発生する可能性があります。
@EventHandler(MyEvent, MyOtherEvent)
class MyHandler {
...
複数行に分けることもできます。
@EventHandler(
MyEvent,
MyOtherEvent,
)
class MyHandler {
...
最後の2つの例では、次のものを生成する必要があります。
MyEvent -> MyHandler
MyOtherEvent -> MyHandler
次のような一致が得られますが:
MyEvent,
MyOtherEvent,
)
class MyHandler
これら2つの部分を組み合わせる方法がわかりません。
正規表現のみを使用してこれを行うのが賢明ではない場合は、他の解決策を使用することもできますが、CLIツールを好む。 「正しい」ことは、プログラミング言語の反映メカニズムを使用することかもしれませんが、それほど複雑ではないと思います。すべてのイベント名はで終わりEvent
、すべてのハンドラ名はで終わりHandler
、コメントとクラス定義がすぐに続くと仮定できます。
答え1
次のことができます。
perl -l -0777ne '
while (/\@EventHandler\(([^)]+)\)\s+class\s+(\w+)/g) {
$class = $2;
print "$_ -> $class" for $1 =~ /\w+/g
}' < your-file