文字列のリストがあります。その一部は という形式です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
のみ、または に一致します。また、 が先行し、 が続く場合は、空の文字列に一致します。banana
123-
-456
123-
456
見回す | 名前 | 何をするのか |
---|---|---|
(?= フー) | 先のことを考える | 文字列の現在の位置の直後にfooがあると主張します。 |
(?<=foo) | 後ろを見て | 文字列の現在の位置の直前にあるのがfooであると主張します。 |
(?!ふー) | 否定先読み | 文字列の現在の位置の直後に続くものはfooではないと主張します。 |
(?<!foo) | 否定的な後読み | 文字列の現在の位置の直前にあるものがfooではないことを主張する |