1. ホーム
  2. regex

[解決済み] regex オプションのワードマッチ

2022-03-08 15:23:29

質問

歌手、作詞家を抽出するための正規表現を作ろうとしています。作詞家の検索をオプションにするにはどうしたらよいでしょうか。

複数行の文字列のサンプル。

Fireworks Singer: Katy Perry
Vogue Singers: Madonna, Karen Lyricist: Madonna

Regex: /Singers?:(.\*)\s?Lyricists?:(.\*)/

これは2行目に正しくマッチし、以下のように抽出されます。 Singers(Madonna, Karen)Lyricists(Madonna)

しかし、リリシストが存在しない最初の行ではうまくいきません。

作詞家検索をオプションにするにはどうしたらいいですか?

解決方法は?

マッチングさせたい部分を、キャプチャしないグループで囲むことができます。 (?:) . そうすると、正規表現ではひとつのユニットとして扱われ、その後に ? の後につけて、オプションにすることができます。例

/Singers?:(.*)\s?(?:Lyricists?:(.*))?/

なお、ここでは \s? は無意味です。 .* は貪欲にすべての文字を食べるので、バックトラックは必要ありません。また、このことは (?:Lyricists?:(.*)) の部分は、同じ理由で決してマッチしません。欲張りでないバージョンの .* , .*? とともに $ を使用すると、これを修正することができます。

/Singers?:(.*?)\s*(?:Lyricists?:(.*))?$/

余分な空白が捕捉されてしまいますが、これも削除して、最終的に以下のような正規表現が得られます。

/Singers?:\s*(.*?)\s*(?:Lyricists?:\s*(.*))?$/