多対一の組み合わせと一致する正規表現を出力するには?

多対一の組み合わせと一致する正規表現を出力するには?

ファイル内の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

おすすめ記事