正则表达式匹配一个数字两到四次

Ren*_*ani 75 regex numbers

这是一个关于正则表达式的简单问题,但我找不到答案.

我想确定一个数字是否按顺序出现两次四次.我可以使用什么语法?

\d{what goes here?}

我试过\d{2,4},但这个表达式也接受三位数.

rua*_*akh 117

没有具体的语法,但有很多方法可以做到:

(?:\d{4}|\d{2})    <-- alternation: four digits or two
\d{2}(?:\d{2})?    <-- two digits, and optionally two more
(?:\d{2}){1,2}     <-- two digits, times one or two
Run Code Online (Sandbox Code Playgroud)

  • 对于像我这样的人,不理解使用`(?:`这会启动一个"非捕获组"(一个不打算在替换语句中引用的组).你也可以只使用parens但这些将创建一个捕获组.更多详细信息请访问:http://stackoverflow.com/questions/3512471/non-capturing-group (8认同)
  • 就个人而言,一开始就想到了“\d{2}(?:\d{2})?”解决方案 - 各种各样的解决方案 - 特别是最后一个,看起来非常好且可扩展。 (2认同)
  • +1,注意使用交替匹配4位数字然后2位数时所需的顺序.提供其他变化也很好. (2认同)

JGF*_*FMK 8

(?<!\d)(\d{2}|\d{4})(?!\d)
Run Code Online (Sandbox Code Playgroud)

这是正确的做法。接受的答案是错误的。

它将匹配 3 个数字(或 5 个)。所以这在我看来是错误的

1) 检查在2、4位数字序列之前或2、4位数字序列之后没有数字。

  • (<!) 语法是负面的回顾

  • (?!) 语法是负前瞻。

以上适用于中弦:

如果您的搜索字符串周围有没有内容,您可以使用^,并$开始和字符串锚的结尾:

^\d{4}$|^\d{2}$
Run Code Online (Sandbox Code Playgroud)

  • 我不会说[接受的答案](/sf/answers/572400531/)是错误的。我想说这个*问题*不清楚,并且该答案解决了对其的一种有效解释。您的回答提出了另一种有效的解释(我碰巧认为这是一种更有可能的解释 - 但显然提问者没有......)。 (3认同)
  • “它将匹配 3 位数字”不太准确。我认为你的意思是“它将匹配 3 位数序列的 2 位数子序列”。 (3认同)
  • 另外,您的答案[在 5 个或更多数字的序列上不太按预期工作](https://regex101.com/r/GxN7wm/2)。我不是正则表达式专家,但我想[修复它](https://regex101.com/r/hVbQaA/1)的一种方法是使负向前/向后适用于两种情况(2-和4-数字序列): `(?&lt;!\d)(\d{2}|\d{4})(?!\d)` (2认同)