代码之家  ›  专栏  ›  技术社区  ›  James Howell

Regex-删除特殊字符但保留负数

  •  0
  • James Howell  · 技术社区  · 2 年前

    我正在React中构建一个数字步进器组件,它需要支持整数(正和负)和十进制。我只想在状态中保留任何可能值的数字部分,以便算术方法正确工作。

    所以:

    用户输入5,5处于存储状态

    用户进入5.5,5.5处于存储状态

    用户输入5.57,5.57处于存储状态

    用户输入-5,-5处于存储状态

    为此,我一直在 .replace() 要删除任何特殊字符:

    value.replace(/[^0-9.]/, '')

    但是,这会删除减号 - 字符的负值。我尝试将其添加到捕获组中,如下所示: replace(/[^0-9.-]/, '') 但这两者都匹配 -5 5 - 3 。我想保留负数,但不包括任何其他使用减号的情况。

    有什么想法吗?

    谢谢

    0 回复  |  直到 2 年前
        1
  •  0
  •   Pygy    2 年前

    这似乎符合您的要求:

    const trimSpecial = x => x
      // first preserve all `-`
      .replace(/[^0-9.-]/g, '')
      // then remove all `-` except, optionally, the one in first position
      .replace(/(?!^-)-/g, '')
    
    const test = x=>console.log(x, "=>", trimSpecial(x))
    
    test("-5.8")
    test("$-3")
    test("-5-5")
    test("6 - 6")
        2
  •  0
  •   Wiktor Stribiżew    2 年前

    您可以使用

    value.replace(/(-\d*\.?\d+).*|[^0-9.]/g, '')
    

    细节

    • (?!^)- -不在字符串开头的连字符
    • | -或者
    • [^0-9.-] -数字、点或连字符以外的任何字符。

    const c = ['5', '5.5', '£5.57', '-5', '-5-5', '5-3'];
    const re = /(?!^)-|[^0-9.-]/g;
    for (var i of c) {
        console.log(i, '=>', i.replace(re, ''));
    }