【问题标题】:Regular Expression to match only odd or even number正则表达式仅匹配奇数或偶数
【发布时间】:2009-03-27 21:29:32
【问题描述】:

我有一个用户可以输入到数据库中的文本条目列表,我需要使用正则表达式验证这些输入,因为其中一些很复杂。其中一个字段的数字必须有空格(即 10、12、14、16...)。我的问题是,是否有一个正则表达式结构允许我只匹配偶数或奇数运行?我知道我可以提取这个值并对其进行除法检查,但如果可能的话,我希望有一个纯正则表达式解决方案。

[编辑]

我最终使用的解决方案是对 JaredPar 的改编,因为除了只需要奇数或偶数之外,我还需要限制一个范围(即 10-40 之间的所有偶数)。下面是完成的正则表达式。

^[123][02468]$

【问题讨论】:

  • 您的正则表达式中的 {1} 可能完全没有必要,尽管您的正则表达式引擎可能与我的不同。
  • 该正则表达式将匹配最多 48 个数字。如果您想将其限制为 40,您需要:^[123][02468]|40$
  • Chris 是对的:正则表达式中的 {1} 是纯粹的噪音,无论您使用哪种正则表达式风格。
  • 谢谢,我已经调整了上面的正则表达式。

标签: regex


【解决方案1】:

奇数

"^\d*[13579]$"

偶数

"^\d*[02468]$"

带有 , 和潜在空格分隔符的奇数运行

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

使用 , 和潜在的空白分隔符运行偶数

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

【讨论】:

  • 你真是聪明
  • 极好的解决方案
【解决方案2】:

Regex 实际上并不难设计,如果您考虑到偶数或奇数可以仅通过查看最后一位数字来测试,最后一位数字也需要是偶数或奇数。所以奇数运行的正则表达式可能是:

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

将 [13579] 替换为 [02468] 以获得偶数...

【讨论】:

    【解决方案3】:

    你的意思是这样的:

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

    或您的问题的其他三种可能的解释之一?

    【讨论】:

    • 我认为您还需要在每个组中为第二个子组加注星标,不是吗?
    猜你喜欢
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    相关资源
    最近更新 更多