web-dev-qa-db-ja.com

正規表現は正確にn OR m回

Xany regexである次の正規表現を検討してください。

X{n}|X{m}

この正規表現は、Xが発生するかどうかをテストしますexactlynまたはm回。

発生をX正確にnまたはm回テストできる正規表現数量詞はありますか?

84
FThompson

「正確にmまたはn回」を意味する単一の量指定子はありません。あなたのやり方は素晴らしいです。

別の方法は次のとおりです。

X{m}(X{k})?

ここで、m < nおよびkn-mの値です。

76
Mark Byers

量指定子の完全なリストを次に示します(ref。 http://www.regular-expressions.info/reference.html ):

  • ???-0または1回の出現(??は遅延、?は貪欲です)
  • **?-任意の数のオカレンス
  • ++?-少なくとも1回の出現
  • {n}-正確にn発生
  • {n,m}-nmの出現(包括的)
  • {n,m}?-nからmへの出現、遅延
  • {n,}{n,}?-少なくともn発生

「正確にNまたはM」を取得するには、m、nが特別でない限り、数量化正規表現を2回記述する必要があります。

  • X{n,m} if m = n+1
  • (?:X{n}){1,2} if m = 2n
  • ...
48
John Dvorak

いいえ、そのような数量詞はありません。ただし、 バックトラックの問題 を防ぐために、/X{m}(X{m-n})?/に再構成します。

19
Bergi

TLDR; (?<=[^x]|^)(x{n}|x{m})(?:[^x]|$)

「x n回」または「x m回」したいように見えますが、正規表現へのリテラル翻訳は(x{n}|x{m}).になると思います-このように https://regex101.com/r/vH7yL5/1

または、mを超える「x」のシーケンスを使用できる場合(m> nの場合)、「following no "x"」および「followed no no x」を翻訳して、[^x](x{n}|x{m})[^x]しかし、それは「x」の後ろと後ろに常に文字があると仮定します。ここにあるように: https://regex101.com/r/bB2vH2/1

これを(?:[^x]|^)(x{n}|x{m})(?:[^x]|$)に変更して、「 'x'を追わない、または行の先頭を追う」および「 'x'を追わない、または行の末尾を追う」に変換できます。ただし、次のように、最初の一致には文字が必要で、2番目の文字には前の文字が必要になるため、2つのシーケンスは一致しません(次のようになります)。 https:// regex101。 com/r/oC5oJ4/1

最後に、1文字の距離の一致に一致させるために、「no 'x' after」に肯定的な先読み(?=)を追加したり、「no 'x' before」に肯定的な先読み(?<=)を追加したり、このような: https://regex101.com/r/mC4uX3/1

(?<=[^x]|^)(x{n}|x{m})(?:[^x]|$)

このようにして、必要な 'x'の正確な数だけを一致させます。

3
Enhardened

Enhardenedの答えを見てみると、最後から2番目の表現は、1文字だけのシーケンスとは一致しないと述べています。先読み/後読みを使用せずにこれを修正する簡単な方法があり、それは開始/終了文字を境界文字に置き換えることです。これにより、開始/終了を含むWordの境界と一致させることができます。そのため、適切な式は次のようになります。

(?:[^x]|\b)(x{n}|x{m})(?:[^x]|\b)

あなたがここで見ることができるように: https://regex101.com/r/oC5oJ4/2

1
rozza2058

非常に古い投稿ですが、助けになるかもしれない投稿をしたいと思います。私は質問で述べた方法でそれを正確に試しましたが、うまくいきますが、キャッチがあります:数量の順序が重要です。このことを考慮:

#[a-f0-9]{6}|#[a-f0-9]{3}

これにより、16進数のカラーコード(3桁または6桁の長さ)がすべて検出されます。でもこのようにひっくり返すと

#[a-f0-9]{3}|#[a-f0-9]{6}

3桁の数字または6桁の数字の最初の3桁のみを検索します。これは理にかなっており、正規表現のプロはすぐにこれを発見するかもしれませんが、多くの人にとってこれは独特の行動かもしれません。順序に関係なくこのトラップを回避する可能性のある高度なRegex機能がありますが、誰もがRegexパターンにひざまずいているわけではありません。

1
DanDan