【问题标题】:Regex in javascript to allow only numbers, commas, and a single decimal pointjavascript中的正则表达式只允许数字、逗号和一个小数点
【发布时间】:2016-10-25 08:01:28
【问题描述】:

目前我正在使用这个正则表达式来匹配带有单个小数点的正数

/^\d+(\.\d+)?$/

但这不允许逗号。如何修改它以允许小数点前有零个或多个逗号?

例子:

  • 11,111.00(应该允许) 我可以接受小数点前有任意数量的逗号的数字。

编辑:

有效值

  • 111
  • 11,111
  • 11,111.0
  • 111111

可以使用或不使用逗号输入值。 这个字段的数据类型是SQL MONEY,所以它会处理逗号。

【问题讨论】:

标签: javascript regex


【解决方案1】:

需要

/^(?:\d{1,3}(?:,\d{3})*|\d+)(?:\.\d+)?$/

regex demo

详情

  • ^ - 字符串开头
  • (?:\d{1,3}(?:,\d{3})*|\d+) - 任何一个:
    • \d{1,3}(?:,\d{3})* - 1 到 3 位数字,后跟 0+ 个 , 序列和 3 位数字
    • | - 或
    • \d+ - 1 位或多位数字
  • (?:\.\d+)? - . 和 1+ 位的可选序列
  • $ - 字符串结束。

var strs = [',,,,', '111', '11,111', '11,111.0', '111111'];
var re = /^(?:\d{1,3}(?:,\d{3})*|\d+)(?:\.\d+)?$/;
for (var s of strs) {
  console.log(s + " => " + re.test(s));
}

【讨论】:

  • 不知道这是否重要,但它不允许,比如10,00,00,000,这是印度的有效数字分组。
  • @vlaz:在这种情况下,{3} should be changed to +
  • this dataset 进行了测试,顺便说一句,它在其他方面非常好。 (像往常一样)烦人的只是烦人的分组。
  • @vlaz 同意你关于印度分组的观点。但我不是在我的正则表达式中寻找印度分组[但是是的,我是印度人 :)],它适用于美国编号系统。
【解决方案2】:

这是一个非常简单的通用解决方案,没有任何关于需要多少位数的假设。

/^\d[\d,]*(\.\d+)?$/

[\d,] 将匹配数字或逗号。
如果您确实需要更具体的正则表达式,则可以使正则表达式更复杂。

【讨论】:

  • 只是一个警告,这也将允许像 100,,00.12 这样的东西,但我不确定这是否是一个问题。
  • 这将验证,,,,,,,,,,,,,,,,,我敢打赌这是一个问题。
  • 嗯,是的。 OP 确实需要澄清他的需求。
  • @vlaz 100,,00.12 不是问题。但是,,,,绝对不应该匹配,因为我需要一个有效的数字
  • 在这种情况下,只需在开头添加一个\d
【解决方案3】:

我会用这个

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

demo and explanation

【讨论】:

  • 预制件[很好|regex101.com/r/X40vBl/2]。印度的数字再次出现,但它们可能会或可能不会引起关注。
  • 10,00,00,000 如何成为有效的@vlaz?
  • 国际支持。例如,在印度,这是一个有效的数字分组 - 如果一个数字很大,除了最后一组数字之外,分组字符每隔 两个 位放置一次。 en.wikipedia.org/wiki/Indian_numbering_system
  • 我不得不处理国际化格式,所以我知道这会带来多大的痛苦。不过,正如我所说,这可能是也可能不是问题——取决于用例。预期的格式已经不是“国际友好的”,因为它预期 , 是数字分隔符,. 是十进制分隔符,当它们可以交换或完全取决于语言环境的不同符号时。我仍然将印度数字作为一个曲线球包含在我的测试集中。
【解决方案4】:

这很难读,但我会解释一下

/^(?:\d+)(?:(?:\d+)|(?:(?:,\d+)?))+(?:\.\d+)?$/

所有?: 都只是明确地对正则表达式引擎说“不要捕获与此括号匹配的以下组)。

简化版是

/^(\d+)((\d+)|((,\d+)?))+(\.\d+)?$/

但它会无缘无故地捕获很多匹配的组,所以我删除了它们

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    • 2021-07-26
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多