X
がany regexである次の正規表現を検討してください。
X{n}|X{m}
この正規表現は、X
が発生するかどうかをテストしますexactlyn
またはm
回。
発生をX
正確にn
またはm
回テストできる正規表現数量詞はありますか?
「正確にmまたはn回」を意味する単一の量指定子はありません。あなたのやり方は素晴らしいです。
別の方法は次のとおりです。
X{m}(X{k})?
ここで、m < n
およびk
はn-m
の値です。
量指定子の完全なリストを次に示します(ref。 http://www.regular-expressions.info/reference.html ):
?
、??
-0または1回の出現(??
は遅延、?
は貪欲です)*
、*?
-任意の数のオカレンス+
、+?
-少なくとも1回の出現{n}
-正確にn
発生{n,m}
-n
〜m
の出現(包括的){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
いいえ、そのような数量詞はありません。ただし、 バックトラックの問題 を防ぐために、/X{m}(X{m-n})?/
に再構成します。
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'の正確な数だけを一致させます。
Enhardenedの答えを見てみると、最後から2番目の表現は、1文字だけのシーケンスとは一致しないと述べています。先読み/後読みを使用せずにこれを修正する簡単な方法があり、それは開始/終了文字を境界文字に置き換えることです。これにより、開始/終了を含むWordの境界と一致させることができます。そのため、適切な式は次のようになります。
(?:[^x]|\b)(x{n}|x{m})(?:[^x]|\b)
あなたがここで見ることができるように: https://regex101.com/r/oC5oJ4/2 。
非常に古い投稿ですが、助けになるかもしれない投稿をしたいと思います。私は質問で述べた方法でそれを正確に試しましたが、うまくいきますが、キャッチがあります:数量の順序が重要です。このことを考慮:
#[a-f0-9]{6}|#[a-f0-9]{3}
これにより、16進数のカラーコード(3桁または6桁の長さ)がすべて検出されます。でもこのようにひっくり返すと
#[a-f0-9]{3}|#[a-f0-9]{6}
3桁の数字または6桁の数字の最初の3桁のみを検索します。これは理にかなっており、正規表現のプロはすぐにこれを発見するかもしれませんが、多くの人にとってこれは独特の行動かもしれません。順序に関係なくこのトラップを回避する可能性のある高度なRegex機能がありますが、誰もがRegexパターンにひざまずいているわけではありません。