次の正規表現について考えてみます。ここで、Xは任意の正規表現です。
X{n}|X{m}
この正規表現は、正確にまたは何度X発生するかをテストします。 nm
X発生を正確にnまたは何度もテストできる正規表現の数量詞はありmますか?
「正確に m 回または n 回」を意味する単一の量指定子はありません。あなたのやり方は大丈夫です。
別の方法は次のとおりです。
X{m}(X{k})?
ここでm < n、kは の値ですn-m。
量指定子の完全なリストは次のとおりです (参照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}もしもm = n+1(?:X{n}){1,2}もしもm = 2nいいえ、そのような数量詞はありません。しかし、バックトラッキングの問題/X{m}(X{m-n})?/を防ぐために再構築します。
TLDR;(?<=[^x]|^)(x{n}|x{m})(?:[^x]|$)
「xn 回」または「xm 回」が必要なようです。正規表現への直訳は次のようになると思い(x{n}|x{m}).
ますhttps://regex101.com/r/vH7yL5/1
または、m 個を超える "x" のシーケンスを持つことができる場合 (m > n と仮定)、「"x" の後に続かない」と「"x" の後に続かない」を追加できます[^x](x{n}|x{m})[^x]。 「x」の前後に常に文字があると仮定します。ここでわかるように: https://regex101.com/r/bB2vH2/1
に変更して(?:[^x]|^)(x{n}|x{m})(?:[^x]|$)、「「x」がないか、行頭に続く」および「「x」がないか、行末が続く」に変換できます。ただし、ここでわかるように、間に 1 文字しかない 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」の正確な数だけを一致させます。