允许使用逗号和两位小数的正则表达式

时间:2016-04-01 18:23:59

标签: html ruby-on-rails regex

我正在尝试使用pattern属性创建一个数字输入字段,因为常规类型编号不支持我需要的验证。

基本上,我想允许任何有意义的数字,包括开头的$+-以及结尾的%。此外,用户应该能够用逗号分隔他们的号码,以避免长号码的错误,但这不是必要的,他们仍然可以提交一个长号而不需要任何类型的分离。该字段还应允许小数。

<input required pattern="[+-]?\$?\d+(,\d{3})*(\.\d+)?%?" type="text" />

我需要允许以下示例:

通过:

  • 2000
  • -20%
  • 2000
  • $ 2,000.00
  • 999,999,999,999,999,999,999.99

故障:

  • 123e9
  • 任何有字母的东西

这是我到目前为止的正则表达式,但它似乎不起作用,即使对于最基本的数字。我一直在使用scriptular来测试我的正则表达式,但这似乎并不反映实际HTML验证的结果。

正则表达式:[+-]?\$?\d+(,\d{3})*(\.\d+)?%?

编辑:对于任何Ruby on Rails开发人员,我意识到我的一个错误是你必须在生成text_field时逃避正则表达式中的任何反斜杠。例如,答案中的正则表达式应该类似于(?:\\+|\\-|\\$)?\\d{1,}(?:\\,?\\d{3})*(?:\\.\\d+)?%?

1 个答案:

答案 0 :(得分:1)

尝试使用以下正则表达式。

正则表达式: (?:\+|\-|\$)?\d{1,}(?:\,?\d{3})*(?:\.\d+)?%?

<强>解释

  • (?:\+|\-|\$)?匹配数字前面的+ -$,可选择使用?量词。

  • \d{1,}匹配整数部分,即使它没有,

  • (?:\,?\d{3})*匹配多次出现的逗号分隔数字(如果存在)。

  • (?:\.\d+)?匹配可选的小数部分。

  • %?最后匹配可选的%字符。

  • ?:代表非捕获组。它会匹配,但不会将其存储为反向引用。

<强> Regex101 Demo