次の正規表現について考えてみます。ここで、X
は任意の正規表現です。
X{n}|X{m}
この正規表現は、正確にまたは何度X
発生するかをテストします。 n
m
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」の正確な数だけを一致させます。