【问题标题】:Regular expression to match a list of floats匹配浮点数列表的正则表达式
【发布时间】:2018-10-30 15:19:07
【问题描述】:

我正在寻找一个允许以下输入的正则表达式:

100,120

10.50,100

129,10.6

1.1,2.4

并拒绝任何其他输入。 基本上,验证数字(浮点数或整数)的正则表达式由逗号(,)正确分隔。

下面是我的 HTML 输入代码,

<input type='text' className='form-control' pattern='/^-?\d*\.?\d*$/' required/>

试用:

我尝试了建议的正则表达式 /^-?\d+(?:\.\d+)?,-?\d+(?:\.\d+)?$/ 包裹在 \ 中并附加到 pattern 属性。

这个正则表达式在

的情况下显示无效输入

1,2 1,2,3 1.0,1.2

【问题讨论】:

  • 请与我们分享您自己解决此问题的尝试。我们很乐意提供帮助,但不太热衷于免费工作。
  • 这样可以:^-?\d+(?:\.\d+)?,-?\d+(?:\.\d+)?$ 作为模式。
  • @Poul Bak,"2,5,7,5".match(/^-?\d+(?:\.\d+)?,-?\d+(?:\.\d+)?$/); 返回 false。与"2" 相同。
  • 我可以在输入标签的pattern 属性中使用相同的正则表达式吗?或者我需要更改任何字符以使此 RegEx 在 Pattern 属性中工作?
  • @Amessihel,当然它返回 fals,你不能使用与分隔符相同的小数分隔符。

标签: javascript regex


【解决方案1】:

这里应该是一个工作正则表达式(注意:非捕获组比捕获组更好):

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

在这个正则表达式中:

  • \d+(?:\.\d*)? = 一个单独的整数部分的值,或者带有一个可能是十进制值的点
  • \.\d+ = 只有小数部分(即点后跟数字)

float 是第一个或第二个形状中的一个。

知道了,你想要的是一个浮动列表,即单个项目或一个项目后跟一些项目,每个项目都以逗号为前缀。这就是(?:,...) 的含义,其中... 是第一项正则表达式。

那些测试通过了:

a-> false
1-> true
2.-> true
.3-> true
1,2-> true
,-> false
1,-> false
,2,-> false
5,6,a-> false
5,a,6-> false
1,.2,3.,4.5-> true
1,.2,.3,4,5,a,6-> false

下面,一个工作的 sn-p 来做额外的测试:

r = /^(?:\d+(?:\.\d*)?|\.\d+)(?:,(?:\d+(?:\.\d*)?|\.\d+))*$/;
Array(
  "a",
  "1",
  "2.",
  ".3",
  "1,2",
  ",",
  "1,",
  ",2,",
  "5,6,a",
  "5,a,6",
  "1,.2,3.,4.5",
  "1,.2,.3,4,5,a,6").forEach(function(e) {
  console.log(e + "-> " + 
              r.test(e));
});

如果允许其他方法,为什么不使用parseFloat,如下所示:

Array(
      "a",
      "1",
      "2.",
      ".3",
      "1,2",
      ",",
      "1,",
      ",2,",
      "5,6,a",
      "5,a,6",
      "1,.2,3.,4.5",
      "1,.2,.3,4,5,a,6").forEach(function(e) {
      console.log(e + "-> " + 
                  areThoseCommaSeparatedFloats(e));
    });

function areThoseCommaSeparatedFloats(line) {
  try {
    line.split(",").forEach(function(v) {
      // If the value is not a float
      // (in which case parseFloat return NaN)
      // throw an exception
      if (isNaN(parseFloat(v))) throw {};
    });
  } catch (e) {
    // A not-a-number value was found
    return false;
  }
  // All the values are numbers
  return true;
}

【讨论】:

  • 非常好。(?:\d+(?:\.\d*)?|\.\d+)
  • @sln 谢谢。在这里,如果使用捕获组而不是非捕获组会有所不同吗?
  • Regex1: ^(\d+(\.\d*)?|\.\d+)(,(\d+(\.\d*)?|\.\d+))*$ Options: &lt; m &gt; Completed iterations: 50 / 50 ( x 1000 ) Matches found per iteration: 5 Elapsed Time: 1.35 s, 1345.12 ms, 1345116 µs Matches per sec: 185,857 Regex2: ^(?:\d+(?:\.\d*)?|\.\d+)(?:,(?:\d+(?:\.\d*)?|\.\d+))*$ Options: &lt; m &gt; Completed iterations: 50 / 50 ( x 1000 ) Matches found per iteration: 5 Elapsed Time: 0.77 s, 769.88 ms, 769880 µs Matches per sec: 324,725
  • @sln 确实。我一直在寻找它,没有得到答案。你的例子很清楚。谢谢,我编辑了答案。
  • @Amessihel,非常感谢您的帮助。我终于找到了另一种方法,源自parseFloat。我开始使用parseFloat。也许它正在将一些无效输入转换为有效输入。例如。 3 3 转换为3,4abc.1 转换为4 等。基本上parseFloat 是numbers 的所有前导数字,并修剪其余无效space 和characters。我认为这是一种验证输入的模糊方式。所以,最后使用array.split(',') 和isNaN() 来验证逗号分隔的十进制和整数组合。
【解决方案2】:

最终使用array.split(',') 和isNaN() 来验证逗号分隔的十进制和整数组合。

var input = Array.from(input.value.split(',').map(item =&gt; item.trim())); input.some(function(i) {return isNan(i)})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 2015-07-18
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    相关资源
    最近更新 更多