更新正则表达式模式以允许.xx而不是仅0.xx

时间:2017-10-25 11:26:06

标签: javascript regex

我有一个正则表达式,用于测试期望货币的用户输入。此语句允许使用可选的美元符号,允许使用可选的逗号(只要它们被正确放置),并允许一个小数点,只要它后跟至少另一个数字。

^\$?\d{1,3}(,?\d{3})*(\.\d{1,2})?$

例如

  • $ 12.12
  • 0.34
  • 12000
  • 12,000000

都是设计允许的。然而,有一个与我想要的不匹配。如果用户想要输入类似.34的数字,则必须输入零。所以0.34匹配,但.34没有。

这是我如何更新声明以解决此问题。

^(\$?\d{1,3}(,?\d{3})*)?(\.\d{1,2})?$

我在小数点之前将整个语句作为捕获组并使其成为可选项。我现在担心的是,我的整个正则表达式语句由两个可选的捕获组包围。我不想要一个空白区域来匹配这种模式,我认为它会。对于我想要完成的事情,有没有更好的选择?

编辑:我的原始语句不匹配.12然而,第二个更新的语句确实存在,因为整个语句包含在可选的捕获组中,空格会匹配此模式,这是不可取的。

2 个答案:

答案 0 :(得分:2)

您的可选群组是正确的进行方式。请注意,当您不必在以后访问捕获的子值时,仅用于对子模式序列进行分组的非捕获组会更有效。

你唯一真正想念的是避免匹配一个空字符串。你可以使用积极的前瞻(?=.)(?!$)否定前瞻来实现它:

^(?!$)(?:\$?\d{1,3}(?:,?\d{3})*)?(?:\.\d{1,2})?$

请参阅regex demo

<强>详情

  • ^ - 字符串开头
  • (?!$) - 字符串
  • 开始后没有字符串结尾
  • (?: - 启动可选的非捕获组
    • \$? - 1或0 $个符号
    • \d{1,3} - 1至3位数字
    • (?: - 非捕获组的开始重复0+序列
      • ,? - 1或0逗号
      • \d{3} - 3位数
    • )* - 非捕获组的结束
  • )? - 可选非捕获组的结尾
  • (?:\.\d{1,2})? - 一个可选的非捕获组,匹配1或0个序列
    • \. - 一个点
    • \d{1,2} - 1或2位数字
  • $ - 字符串结束。

答案 1 :(得分:0)

您可以使用&#34;或&#34;语法|

^\$?(\d{1,3}(,?\d{3})*|0)(\.\d{1,2})?$

我还建议你不要捕捉(,\d{3})*

的内部群体
^\$?(\d{1,3}(?:,?\d{3})*|0)(\.\d{1,2})?$

(\d{1,3}(?:,?\d{3})*|0)金额\d{1,3}(?:,?\d{3})*0