以下の正規表現が 1 を受け入れる理由を知りたいです。
"((^G0{0,2}$)|(^T|^R0{0,2}$)){0,5}"
正規表現でシーケンス G00、G01、T00、R00 を何度でも受け入れるようにしたいと思います。現時点では、G00、T00、R00 を何度でも使用しようとしていますが、私の正規表現は入力として 1 も受け入れています。正規表現は G、G0、T、T0、R、R0 も受け入れる必要がありますが、目標は 3 文字のシーケンスを持つことです。
regexp は、一致長 0 で、交互の 0 回の繰り返しに一致しています (0 回繰り返した場合、^
アンカーは発火しないため、どこでも一致する可能性があります)。繰り返しの外側のアンカーを抽出する必要があります。何かのようなもの...
^(?:[GTR]\d{0,2})+$
- start
--- -- any number of repetitions (1+) of
----- any of "G", "T", or "R"
------- 0-2 digits
- end
メイン シーケンスが繰り返される場合、キャプチャ グループは意味をなさないので、それらを取り除きました。
現在、正規表現は空の文字列に一致し、何も見つかりません。
(...){0, 5}
...
は0 回一致する可能性があるため、すべての文字列で一致が見つかります。
あなたの特定の要件(これらの4つの入力のみに一致するため)は、おそらくこのような正規表現が必要です
^(?:G01)|[GRT]00$
http://rubular.com/r/BrlxDfGkdf
行ごとに複数の一致を取得できるようにする場合は、アンカーをそのままにしておくだけではありません^
。$
(?:G01)|[GRT]00
これを 0 ~ 5 回繰り返すことができるため、何にでも 0 回一致する可能性があると思います。少なくとも一度は強制的に一致させてみませんか?
"((^G0{0,2}$)|(^T|^R0{0,2}$))+"