【问题标题】:Javascript regex positive negative decimal numberJavascript 正则表达式正负十进制数
【发布时间】:2020-07-08 09:21:58
【问题描述】:

我需要一个正则表达式,它可以匹配正负十进制值、空字符串 ('') 以及仅减号 ('-')。由于我需要在处理数字字段更改的函数中使用它,并且为了添加负值,用户首先添加“-”或删除旧值(“”),我需要匹配所有这 3 个条件。

所以,总而言之,正则表达式应该允许:

  • 正负十进制值(也是 0)
  • “”(空字符串)
  • “-”(减号字符串)

到目前为止我所拥有的是:

function sanitizeInputValue(value: string) {
  var re = new RegExp('^$|^-?\\d{1,9}(\\.\\d{1,2})?$');
  return value.match(re) === null ? 0 : value;
}

【问题讨论】:

  • 为什么必须是正则表达式?为什么不return value === "-" || value === "" || !isNaN(value) ? value : 0
  • 那么您面临的问题是什么?看来您的代码工作正常

标签: javascript regex


【解决方案1】:

使用 javascript 内置的 Number 在您从函数返回之前将字符串转换为数值。

另外,我修改了您的正则表达式,使其可以接受.230.2345 之类的输入。

function sanitizeInputValue(value) {
  var re = new RegExp('^$|^-?(\\d+)?(\\.?\\d*)?$');
  return value.match(re) === null ? 0 : Number(value);
}

console.log(sanitizeInputValue("-23"));     // -23
console.log(sanitizeInputValue("42.123"));  //  42.123
console.log(sanitizeInputValue("-.34"));    // -0.34
console.log(sanitizeInputValue(""));        //  0
console.log(sanitizeInputValue("-8."));     //  -8
console.log(sanitizeInputValue("-8.4"));     // -8.4

【讨论】:

  • Number("-") 会返回 NaN。听起来"-" 是有效输入,但也许我弄错了。
  • 显然我需要它来匹配“-8”。因为用户要输入一个负十进制值,帮助? :)
【解决方案2】:
function sanitizeInputValue(value) {
  var re = /^$|\-?[0-9]\d*(\.\d*)?|-/;
  return value.match(re) ? value : 0;
}

【讨论】:

    【解决方案3】:

    您可以选择匹配带有小数部分的数字,这样您也可以只匹配连字符^$|^-?(?:\d{1,9}(\.\d{1,2})?)?$

    由于所有部分都是可选的,您可以省略^$,然后所有部分都是可选的。

    ^-?(?:\d{1,9}(?:\.\d{1,2})?)?$
    

    解释

    • ^ 字符串开始
    • -? 可选连字符
    • (?:非捕获组
      • \d{1,9} 匹配一个数字 1-9 次
      • (?:\.\d{1,2})? 可选匹配一个点和 1-2 位数字
    • )?关闭非捕获组并将其设为可选
    • $ 字符串结束。

    Regex demo

    var re = new RegExp("^-?(?:\\d{1,9}(?:\\.\\d{1,2})?)?$");
    
    [
      "",
      "-",
      "1",
      "1.2",
      "test",
      "1234567890",
      "1.123",
      "-2",
      "-2.6"
    ].forEach(s => console.log(s + " --> " + re.test(s)));

    编辑

    由于您还想匹配 -8. 并且不想限制位数,您可以使用:

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

    解释

    • ^ 字符串开始
    • -? 可选-
    • (?:非捕获组
      • \d+\.?\d* 匹配 1+ 位、可选点和 0+ 位
    • )? 关闭群组并将其设为可选
    • $字符串结束

    Regex demo

    var re = new RegExp("^-?(?:\\d+\\.?\\d*)?$");
    [
      "-8.",
      "",
      "-",
      "1",
      "1.2",
      "test",
      "1234567890",
      "1.123",
      "-2",
      "-2.6"
    ].forEach(s =>
      console.log(s + " --> " + re.test(s))
    );

    【讨论】:

    • 我发现您的解决方案与十进制值不匹配(-2、-2.6 ....)
    • @CristinaMarin:它确实符合这些值。是什么让你认为它没有?你测试过吗?
    • ('-2.5').match(new RegExp('^-?(?:\d{1,9}(?:\.\d{1,2})?)? $')) 返回 null
    • @CristinaMarin 您必须对 RegExp 构造函数中的反斜杠进行双重转义。我在 Javascript 中添加了一个示例。
    • @CristinaMarin:或者使用正则表达式文字:/^-?(?:\d{1,9}(?:\.\d{1,2})?)?$/.test("-2.6")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    相关资源
    最近更新 更多