这是一个关于正则表达式的简单问题,但我找不到答案。
我想确定一个数字是否恰好出现 两次 或 四次。我可以使用什么语法?
\d{填什么?}
我尝试过\d{2,4}
,但这个表达式也接受三个数字。
没有特定的语法,但有很多方法可以做到:
(?:\d{4}|\d{2}) <-- alternation: four digits if possible, else just two
\d{2}(?:\d{2})? <-- two digits, plus two more if possible
(?:\d{2}){1,2} <-- two digits, times one or two
例如,要匹配由一个或多个字母 A-Z 后跟两个或四个数字的字符串,可以编写^[A-Z]+(?:\d{4}|\d{2})$
;要匹配由逗号分隔的两或四位数字列表,可以编写 ^((?:\d{4},|\d{2},)*(?:\d{4}|\d{2})$
或 ^(?:\d{2}(?:\d{2})?,)*\d{2}(?:\d{2})$
。
\d{2}(?:\d{2})?
这个解决方案 - 这些方案的变化很好 - 特别是最后一个,看起来非常好且可扩展。 - Nightfirecat(?:
的用法的人,它是用来开始一个"非捕获组"(不打算在替换语句中引用的组)。你也可以只使用圆括号,但这会创建一个捕获组。更多细节请参见这里:https://dev59.com/QXA75IYBdhLWcg3wBkS1 - Jeremy Moritz(?<!\d)(\d{2}|\d{4})(?!\d)
这是正确的做法。被接受的答案是错误的。
它将匹配3位数(或5位数)。所以在我看来是错的。
(?<!)
语法是负向回顾。
(?!)
语法是负向前瞻。
上述方法适用于字符串的中间位置:
如果您的搜索字符串周围没有内容,您可以使用^
和$
作为字符串的开头和结尾锚点:
^\d{4}$|^\d{2}$
(?<!\d)(\d{2}|\d{4})(?!\d)
。 - Jean-François Corbett
abc 123 xyz
,您希望发生什么?它应该匹配12
,因为这是恰好连续两个数字吗?还是不应该,因为12
是更大的数字序列123
的一部分,而123
本身既不是2位也不是4位长?如果我必须猜测,我认为您想要后者的行为,但从您的问题中并不清楚。示例和/或更清晰的规范将有所帮助。 对于abc 12345 def
的同样问题...那里应该发生什么? - Jean-François Corbett