正規表現の一部をキャプチャせずに一致させるにはどうすればよいでしょうか? 質問する

正規表現の一部をキャプチャせずに一致させるにはどうすればよいでしょうか? 質問する

文字列のリストがあります。その一部は という形式です123-...456。可変部分「...」は次のようになります。

  • 文字列「apple」の後にハイフンが続く、例:123-apple-456
  • 文字列「banana」の後にハイフンが続く、例:123-banana-456
  • 空白の文字列、例: 123-456(ハイフンは 1 つだけであることに注意してください)

「リンゴ」または「バナナ」以外の単語は無効です。

これら 3 つのケースでは、それぞれ「apple」、「banana」、「」に一致させたいと思います。ハイフンをキャプチャするのではなく、常に一致させたいということに注意してください。文字列が上記の形式でない場合は123-...456、まったく一致しません。

これを実行するには、正規表現をどのように記述すればよいでしょうか? 先読み、後読み、前後読み、および非キャプチャ グループを許可するフレーバーがあると仮定します。


ここでの重要な観察は、「apple」または「banana」のいずれかがある場合、末尾のハイフンも必要であるが、それを一致させたくないということです。また、空白の文字列を一致させる場合、末尾のハイフンがあってはなりません。この主張をカプセル化する正規表現が適切だと思います。

ベストアンサー1

何かを捕獲しない唯一の方法は、ルックアラウンドアサーション:

(?<=123-)((apple|banana)(?=-456)|(?=456))

なぜなら、非捕捉グループ(?:…)正規表現全体は、一致した内容をキャプチャします。ただし、この正規表現は、が先行し、 が続く場合にappleのみ、または に一致します。また、 が先行し、 が続く場合は、空の文字列に一致します。banana123--456123-456

見回す 名前 何をするのか
(?= フー) 先のことを考える 文字列の現在の位置の直後にfooがあると主張します。
(?<=foo) 後ろを見て 文字列の現在の位置の直前にあるのがfooであると主張します。
(?!ふー) 否定先読み 文字列の現在の位置の直後に続くものはfooではないと主張します。
(?<!foo) 否定的な後読み 文字列の現在の位置の直前にあるものがfooではないことを主張する

おすすめ記事