【问题标题】:How to implement negative null floating point regex如何实现负空浮点正则表达式
【发布时间】:2020-08-31 10:11:25
【问题描述】:

我可以使用什么作为验证浮点数的正则表达式?

数字可以是负数,不能以 0 开头(除非是实数 0,或 0 后跟小数点,例如 0.00123

另一方面,正则表达式应该验证部分/未完成的数字。例如:

  • ''(空字符串)有效
  • - 是有效的(它仍然可以是一个有效的数字,并有适当的用户输入)
  • 0 有效(因为0.1 可能有效)
  • 0.0 有效,原因同上
  • -0.000 有效
  • -01 无效
  • .2 无效

我试过这个正则表达式:

 ^(-|-?0\.?[0-9]*|-?[1-9][0-9]*\.?[0-9]*|)$

它允许我丢弃所有非数字值并且仍然允许小数值,但是如何实现用户无法输入格式-0232的数字,但可以输入-0.232的可能性

【问题讨论】:

  • 这里可以输入例子:regex101.com
  • 为什么不允许-0232但允许-0.232?应该在什么时候区分?正数呢,有什么限制吗?您是否可以将字符串更改为数字并在那里执行检查?
  • 输入小数的输入,正负可以是0.n但不能是0n
  • 即用户不能输入格式为0123123或-03123123的数字,但允许输入0.3312312

标签: javascript regex


【解决方案1】:

如果我做对了,您需要一个验证“可能是未来十进制”数字的正则表达式。所以(empty string)--000....应该是有效的。

你可以使用这个正则表达式:

^-?(?:(?!0\d)\d+\.?\d*)?$

你有一个演示 here

解释:

^             # Start of string
-?            # an optional minus
(?:           # non-capturing group
    (?!0\d)   #    whatever comes next, it cannot be 0 + number
    \d+       #    at least one number
    \.?       #    optional dot
    \d*       #    any quantity of numbers
)?            # previous group is optional
$

另外,请记住,前面的东西是一个正则表达式对象。所以你应该尝试在javascript中这样使用它:

/myregex/

但是,javascript 也允许使用基于字符串的正则表达式(在您的 cmets 看来,这就是您想要的...)

在这种情况下,您可以使用new RegExp 语法。但是,请记住,由于您将使用字符串,因此您需要对字符串应该转义的任何字符进行转义。

例如,您可以使用:

function return_some_regex_string() {
  // NOTE backslashes had to be scaped since this is a string, 
  //      not a real regex object
  return '^-?(?:(?!0\\d)\\d+\\.?\\d*)?$';
}

console.log("0.123".match(new RegExp(return_some_regex_string())));
console.log("-03233".match(new RegExp(return_some_regex_string())));
console.log("333-3334".match(new RegExp(return_some_regex_string())));

但是,与此同时,您已经可以返回正则表达式对象,这似乎比使用基于字符串的正则表达式更简单:

function return_some_regex() {
  return /^-?(?:(?!0\d)\d+\.?\d*)?$/;
}

console.log("0.123".match(return_some_regex()));
console.log("-03233".match(return_some_regex()));
console.log("333-3334".match(return_some_regex()));

【讨论】:

  • @frontDev24,成功了!请记住,您可以“接受”带有绿色勾号的答案
  • 你能告诉我如何在你的决定中增加输入单的能力,以及留空值的能力
  • 以及在 -03233 等情况下返回 null 的能力
  • @frontDev24,更改了我的答案以允许唯一的“-”和空字符串。案例-03233 已经在工作了...我在嵌入代码上添加了一些额外的检查供您检查
  • 你疯了我没想到这里有这么多帮助!谢谢
【解决方案2】:

您可以匹配一个可选的连字符,后跟一个浮点数或匹配一个以 1-9 开头的数字

^-?(?:\d+\.\d+|[1-9]\d*|0\.?)$

模式将匹配

  • ^ 字符串开始
  • -? 可选连字符
  • (?:非捕获组
    • \d+\.\d+ 匹配 1+ 个数字、点和 1+ 个数字
    • |或者
    • [1-9]\d* 匹配一个数字 1-9 和 0+ 数字 0-9
    • |或者
    • 0\.? 匹配零和可选点
  • )关闭群
  • $ 字符串结束

Regex demo

let pattern = /^-?(?:\d+\.\d+|[1-9]\d*|0\.?)$/;
["-0123",
  "0123123",
  "-03123123",
  "1234",
  "-0.234",
  "0.4",
  "0.3312312",
  "1",
  "-1234",
  "0",
  "0."
].forEach(s => console.log(`${s} match:${pattern.test(s)}`));

如果你想匹配一个空字符串或一个连字符,你也可以将第二部分设为可选。

^-?(?:\d+\.\d+|[1-9]\d*|0\.?)?$

Regex demo

【讨论】:

  • 很抱歉,但为什么它不能这样工作 let res = '3.3'.match('^(?:-?\d+\.\d+|[1-9]\d*)$' )
  • @frontDev24 试试这样不带单引号 `let res = '3.3'.match(/^(?:-?\d+\.\d+|[1-9]\d* )$/);
  • 我需要一些适用于这种情况的东西 1232 0.1234 -1234 -0.1234
  • @frontDev24 我为比赛添加了一个 Javascript 示例。
  • @frontDev24 喜欢这样然后regex101.com/r/L5VC2J/1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 2020-09-06
相关资源
最近更新 更多