0

以下の正規表現が 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 文字のシーケンスを持つことです。

4

3 に答える 3

2

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

メイン シーケンスが繰り返される場合、キャプチャ グループは意味をなさないので、それらを取り除きました。

于 2013-08-06T15:49:26.317 に答える
1

現在、正規表現は空の文字列に一致し、何も見つかりません。

(...){0, 5} 

...は0 回一致する可能性があるため、すべての文字列で一致が見つかります。


あなたの特定の要件(これらの4つの入力のみに一致するため)は、おそらくこのような正規表現が必要です

^(?:G01)|[GRT]00$

http://rubular.com/r/BrlxDfGkdf

行ごとに複数の一致を取得できるようにする場合は、アンカーをそのままにしておくだけではありません^$

(?:G01)|[GRT]00

http://rubular.com/r/3ODzf08eT5

于 2013-08-06T15:51:22.110 に答える
0

これを 0 ~ 5 回繰り返すことができるため、何にでも 0 回一致する可能性があると思います。少なくとも一度は強制的に一致させてみませんか?

"((^G0{0,2}$)|(^T|^R0{0,2}$))+"
于 2013-08-06T15:55:00.250 に答える