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


95

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

我想确定一个数字是否恰好出现两次四次。我可以使用什么语法?

\d{what goes here?}

我试过了\d{2,4},但是这个表达式也接受三个数字。


例如,要匹配两位或四位数的年份
DavidRR 2012年

如果if字符串是什么,您想发生abc 123 xyz什么?是否应该匹配,12因为顺序恰好是两位数?还是不应该,因为它是一个既不是2也不是4长12的较大数字序列的一部分123?如果我不得不猜测,我会认为您想要后者的行为,但您的问题尚不清楚。示例和/或更清晰的说明将有所帮助。同样的问题abc 12345 def……在那里应该发生什么?
让·弗朗索瓦·科贝特

Answers:


144

没有特定的语法,但是有很多方法可以做到这一点:

(?:\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

1
就个人而言,只想到\d{2}(?:\d{2})?解决方案就可以了-其中种类繁多-尤其是最后一个,看起来非常不错且可扩展。
Nightfirecat

3
+1是为了记住使用交替先匹配4位数字然后匹配2位数字时所需的顺序。提供其他变体形式也很出色。
艾哈迈德·玛吉

9
对于像我一样不理解此用法的任何人,都会(?:启动一个“非捕获组”(该组不能在replace语句中引用)。您也可以只使用括号,但是它们将创建捕获组。此处的更多详细信息:stackoverflow.com/questions/3512471/non-capturing-group
杰里米·莫里茨

对于“ 333”和“ 33”,这些结果将显示相同的结果
Dan

1
@丹:这些正则表达式匹配完整的字符串"333"。您可能错误地使用了regex库的“查找匹配子字符串”功能,而不是其“检查是否完整的字符串匹配”功能。您应该查阅其文档。
ruakh

3
(?<!\d)(\d{2}|\d{4})(?!\d)

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

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

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

  • (<!) 语法是负面的

  • (?!) 语法为负先行。

上面的适用于中间字符串:

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

^\d{4}$|^\d{2}$

1
我不会说公认的答案是错误的。我想说的是这个问题尚不清楚,而且该答案解决了对此问题的一种有效解释。您的答案是另一种有效的解释(我碰巧认为是一种可能的解释-但显然要求者没有...)。
让·弗朗索瓦·科贝特

2
“它将匹配3位数字”不是很准确。我认为您的意思是“它将匹配3位数序列的2位数子序列。”
让·弗朗索瓦·科贝特

1
另外,您的答案对5位数或更多位数的序列不太理想。我不是正则表达式专家,但我想解决它的一种方法是使否定的提前/后退适用于两种情况(2位数和4位数序列):(?<!\d)(\d{2}|\d{4})(?!\d)
Jean-FrançoisCorbett

我认为您对5位数是正确的。感谢您的更正。会解决的。
JGFMK

^\d{4}$|^\d{2}$将是解决该问题的潜在方法。就像那样^\d{2}(?!\d)|^\d{4}(?!\d)
JGFMK
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.