匹配奇数或偶数的正则表达式

32
我有一个文本条目列表,用户可以将其输入到数据库中,我需要使用正则表达式验证这些输入,因为其中一些很复杂。其中一个字段必须在数字之间有间隔(例如,10、12、14、16...)。我的问题是,是否有一种正则表达式构造可以仅匹配偶数或奇数数字序列?我知道我可以提取这个值并对其进行除法检查,但如果可能的话,我希望能够纯粹地使用正则表达式解决这个问题。 [编辑] 我最终使用JaredPar的改编方案,因为除了需要只有奇数或偶数之外,我还需要通过范围限制(即,在10-40之间的所有偶数)来筛选结果。以下是最终的正则表达式: ^[123][02468]$

你的正则表达式中的 {1} 可能完全不必要,尽管你的正则表达式引擎可能与我的不同。 - Chris Lutz
那个正则表达式将匹配最高到48的数字。如果你想限制在40以内,需要这样写:^[123][02468]|40$ - Alan Moore
1
而且克里斯是对的:在正则表达式中的{1}纯粹是噪音,无论你使用哪种正则表达式语言。 - Alan Moore
谢谢,我已经调整了我的正则表达式。 - James
3个回答

80

奇数

"^\d*[13579]$"

偶数

"^\d*[02468]$"

使用逗号和可能存在的空格分隔符运行奇数

"$\s*(\d*[13579]\s*,\s*)*\d*[13579]$"

用逗号和可能包含的空格作为分隔符来运行偶数

"$\s*(\d*[02468]\s*,\s*)*\d*[02468]$"

6

如果您考虑到只需查看最后一位数字,即可测试偶数或奇数,那么正则表达式的设计实际上并不太难。因此,用于奇数运行的正则表达式可能如下:

"^(\s*\d*[13579]\s*,)*(\s*\d*[13579]\s*)$"

将偶数中的[13579]替换为[02468]...


2
你的意思是像这样吗:

您是否指的是类似于以下内容:

/(\d*[02468](, *\d*[02468]))|(\d*[13579](, *\d*[13579]))/

或者根据您提出的问题,有三种其他可能的解释?

我认为你也需要给每个组中的第二个子组点赞,对吗? - David Citron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接