【问题标题】:Javascript Remove all charater except leading - , one dot and digitsJavascript删除除前导 - ,一个点和数字之外的所有字符
【发布时间】:2016-07-19 04:46:34
【问题描述】:

首先这个问题不一样

strip non-numeric characters from string

Regex to replace everything except numbers and a decimal point

我想转换一个带有有效数字的字符串。

--1234// will be -1234
-123-123 will be -123123
12.123.3 will be 12.1233
-123.13.123 will be -123.13123

我试过了

number.replace(/[^0-9.-]/g, '') //it accepts multiple . and -
number.replace(/[^0-9.]-/g, '').replace(/(\..*)\./g, '$1');//it accepts multiple minus

我正面临前导减号的问题。

如何转换一个字符串,该字符串将删除除前导 -(删除其他减号)、数字和仅一个点(删除其他点)之外的所有字符

【问题讨论】:

  • 我认为你不能用正则表达式来做到这一点,你正在将逻辑应用于你的匹配。例如,您想将不同的数字组连接成一个数字,丢弃中间的一些字符。正则表达式不是执行此操作的工具。
  • @FedericoPiazza 我快到了。你能帮我写正则表达式来查找除第一个之外的所有 -(减号)。
  • @ShaifulIslam:我想出了解决 -(减号)问题的解决方案。但是.(decimal)的位置不能用简单的规则来定义。检查我的答案以获得解释。
  • @ShaifulIslam,看看我的回答对你有没有帮助。

标签: javascript regex


【解决方案1】:

在下面给出的示例数据中,

--1234
-123-123
12.123.3
-123.13.123

-(减号或连字符)没有问题,因为它的位置在数字之前,不在数字之间。所以这可以使用以下正则表达式来解决。

正则表达式: -(?=-)|(?<=\d)-(?=\d+(-\d+)?$) 并替换为 empty 字符串。

Regex101 Demo

但是,.(十进制)的位置无法确定。因为123.13.123 也可能表示123.1312312313.123

【讨论】:

  • 很好,但如果在末尾添加减号则不起作用
【解决方案2】:

不是很干净,但可以!

var strings = ["-1234","-123-123","12.123.3", "-123.13.123"];
strings.forEach(function(s) {
    var i = 0;
    s = s.replace(/(?!^)-/g, '').replace(/\./g, function(match) { 
        return match === "." ? (i++ === 0 ? '.' : '') : ''; 
    });
    console.log(s);
});

【讨论】:

  • 感谢您的回答number.replace(/[^0-9.-]/g, '').replace(/(\..*)\./g, '$1').replace(/(?!^)-/g, '');
  • @ShaifulIslam,很高兴我能提供帮助。如果您能接受答案,将不胜感激。
【解决方案3】:

没有正则表达式,您可以通过这种方式映射字符:

// this function takes in one string and return one integer
f=s=>(
    o='',                   // stands for (o)utput
    d=m=p=0,                // flags for: (d)igit, (m)inus, (p)oint
    [...s].map(x=>          // for each (x)char in (s)tring
        x>='0'&x<='9'?      // if is number
            o+=x            // add to `o`
        :x=='-'?            // else if is minus
            m||(p=0,m=o=x)  // only if is the first, reset: o='-';
        :x=='.'?            // else if is point
            p||(p=o+=x)     // add only if is the first point after the first minus
        :0),                // else do nothing
    +o                      // return parseInt(output);
);

['--1234','-123-123','12.123.3','-123.13.123'].forEach(
x=>document.body.innerHTML+='<pre>f(\''+x+'\') -> '+f(x)+'</pre>')

希望对你有帮助。

【讨论】:

  • 对我有利,我可以说我的函数运行在O(n)
【解决方案4】:

我在这里分享我的解决方案。
让我们假设字符串是a;

//this will convert a to positive integer number
b=a.replace(/[^0-9]/g, '');

//this will convert a to integer number(positive and negative)
b=a.replace(/[^0-9-]/g, '').replace(/(?!^)-/g, '');

//this will convert a to positive float number

<s>b=a.replace(/[^0-9.]/g, '').replace(/(..*)./g, '$1');</s>

//this will convert a to float number (positive and negative)

<s>b=a.replace(/[^0-9.-]/g, '').replace(/(..*)./g, '$1').replace(/(?!^)-/g, '');</s>

浮点数更新。(解决复制粘贴问题)

//For positive float number
b=a.replace(/[^0-9.]/g, '').replace('.', 'x').replace(/\./g,'').replace('x','.');

//For Negative float number
b=a.replace(/[^0-9.-]/g, '').replace('.', 'x').replace(/\./g,'').replace('x','.').replace(/(?!^)-/g, '');

【讨论】:

  • 最后一个将'1.2.3.4.5'转换为"1.2.3.45"
  • @Atomosk 感谢您的示例。但是我在输入字段中使用了该表达式。当用户键入一个点时,他们无法为该表达式键入第二个点,这就是为什么我没有注意到该异常。
  • 复制粘贴呢?
【解决方案5】:

根据@Shaiful Islam 的回答,我又添加了一个代码。

var value = number
    .replace(/[^0-9.-]/g, '')       // remove chars except number, hyphen, point. 
    .replace(/(\..*)\./g, '$1')     // remove multiple points.
    .replace(/(?!^)-/g, '')         // remove middle hyphen.
    .replace(/^0+(\d)/gm, '$1');    // remove multiple leading zeros. <-- I added this.

结果

00.434 => 0.434

【讨论】:

  • 它不会删除多个点。
【解决方案6】:

我的解决方案:

number.replace(/[^\d|.-]/g, '') //removes all character except of digits, dot and hypen
      .replace(/(?!^)-/g, '') //removes every hypen except of first position
      .replace(/(\.){2,}/g, '$1') //removes every multiplied dot

然后应该使用Intl.NumberFormat 将其格式化为正确的区域设置。

【讨论】:

  • 多点怎么样?1.2.3
  • 它不起作用,因为没有信息哪个点是小数分隔符。
猜你喜欢
  • 2015-12-03
  • 2018-07-08
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多