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

正则表达式匹配交替的零次重复,匹配长度为 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 回答