删除任何非数字并检查格式是否为有效数字

时间:2016-06-03 16:41:53

标签: javascript regex

我试图找出一个允许字符串的正则表达式模式但删除任何非数字,jekyll build或前导.的内容。

我正在寻找最简单的方法来删除任何非"数字"字符串中的变量。这个解决方案不一定是正则表达式。

这意味着它应该转

-

规则是第一个句点是小数点,并且应删除后面的每个句点。字符串中应该只有一个减号,它应该在前面。

我当时认为应该有一个正则表达式,但我无法绕过它。我发现的大多数正则表达式解决方案允许第二个小数点保持不变。

4 个答案:

答案 0 :(得分:4)

您可以使用此替换方法:

  • 在第一个replace中,我们将删除所有非数字和非DOT字符。唯一的例外是使用前瞻我们否定的第一个连字符。
  • 在带回调的第二个replace中,我们将在第一次DOT后删除所有DOT。

代码&演示:



var nums = ['..1', '1..1', '1.203.00', '-1.203.00', '-1.-1', '.1', '3.h3',
  '4h.34', '4.34', '44', '4h'
]

document.writeln("<pre>")

for (i = 0; i < nums.length; i++)
  document.writeln(nums[i] + " => " + nums[i].replace(/(?!^-)[^\d.]+/g, "").
  replace(/^(-?\d*\.\d*)([\d.]+)$/,
    function($0, $1, $2) {
      return $1 + $2.replace(/[.]+/g, '');
    }))

document.writeln("</pre>")
&#13;
&#13;
&#13;

答案 1 :(得分:2)

我可以使用正则表达式搜索和替换来完成。 num是传入的字符串。

num.replace(/[^\d\-\.]/g, '').replace(/(.)-/g, '$1').replace(/\.(\d*\.)*/, function(s) {
  return '.' + s.replace(/\./g, '');
});

答案 2 :(得分:2)

非正则表达式解决方案,实现了一个简单的单遍解析器。 使用ES5 Array功能是因为我喜欢它们,但是对于for循环也能正常工作。

function generousParse(input) {
  var sign = false, point = false;
  return input.split('').filter(function(char) {
    if (char.match(/[0-9]/)) {
      return sign = true;
    }
    else if (!sign && char === '-') {
      return sign = true;
    }
    else if (!point && char === '.') {
      return point = sign = true;
    }
    else {
      return false;
    }
  }).join('');
}

var inputs = ['1.203.00', '-1.203.00', '-1.-1', '.1', '3.h3', '4h.34', '4.34', '4h.-34', '44', '4h', '.-1', '1..1'];
console.log(inputs.map(generousParse));

是的,它比多个正则表达式替换更长,但它更容易理解并且看到它是正确的。

答案 3 :(得分:1)

好的弱尝试但看起来很好......

&#13;
&#13;
var r = /^-?\.?\d+\.?|(?=[a-z]).*|\d+/g,
  str = "1.203.00\n-1.203.00\n-1.-1\n.1\n3.h3\n4h.34\n44\n4h"
  sar = str.split("\n").map(s=> s.match(r).join("").replace(/[a-z]/,""));
console.log(sar);
&#13;
&#13;
&#13;