Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 删除所有非数字,并检查格式是否为有效数字_Javascript_Regex - Fatal编程技术网

Javascript 删除所有非数字,并检查格式是否为有效数字

Javascript 删除所有非数字,并检查格式是否为有效数字,javascript,regex,Javascript,Regex,我试图找出一个正则表达式模式,它允许字符串,但删除任何不是数字、非或非前导-的内容 我正在寻找从字符串中删除任何非“数字”变量的最简单方法。这个解决方案不必是正则表达式 这意味着它应该转变 1.203.00 -> 1.20300 -1.203.00 -> -1.20300 -1.-1 -> -1.1 .1 -> .1 3.h3 -> 3.3 4h.34 -> 4.34 44 -> 44 4h -> 4 规则是第一个句点是小数点,后面的每个句点都应

我试图找出一个正则表达式模式,它允许字符串,但删除任何不是数字、非
或非前导
-
的内容

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

这意味着它应该转变

1.203.00 -> 1.20300
-1.203.00 -> -1.20300
-1.-1 -> -1.1
.1 -> .1
3.h3 -> 3.3
4h.34 -> 4.34
44 -> 44
4h -> 4
规则是第一个句点是小数点,后面的每个句点都应该删除。字符串中应该只有一个减号,它应该在前面


我在想应该有一个正则表达式,但我就是不知道该怎么做。我找到的大多数正则表达式解决方案都允许保留第二个小数点

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

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

您可以使用以下替换方法:

  • 在第一个
    replace
    中,我们将删除所有非数字和非点字符。唯一的例外是第一个连字号,我们使用了一个向前看
  • 在第二个
    replace
    回调中,我们删除了第一个点之后的所有点
代码和演示:

var nums=['..1',1..1',1.203.00','-1.203.00','-1.-1','.1',3.h3',
‘4h.34’、‘4.34’、‘44’、‘4h’
]
文件。书面形式(“”)
对于(i=0;i”+nums[i]。替换(/(?!^-[^\d.]+/g,”)。
替换(/^(-d*\.\d*)([\d.]+)$/,
函数($0,$1,$2){
返回$1+$2。替换(/[.]+/g');
}))

document.writeln(“”)
可以尝试一下,但似乎没有问题

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]/,“”));

控制台日志(sar)一个非正则表达式解决方案,实现了一个简单的单过程解析器。 使用ES5阵列功能是因为我喜欢它们,但在for循环中也同样适用

函数慷慨大方(输入){
变量符号=假,点=假;
返回input.split(“”).filter(函数(字符){
if(字符匹配(/[0-9]/)){
返回符号=真;
}
else如果(!sign&&char=='-'){
返回符号=真;
}
如果(!point&&char===''.'),则为else{
返回点=符号=真;
}
否则{
返回false;
}
}).加入(“”);
}
变量输入=['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(慷慨解囊))正则表达式不转换任何东西;他们“匹配”事物(即,他们接受常规语言)。我很确定“如果删除将留下一个有效数字的子字符串”的语言是不规则的,所以你不能“用正则表达式”这样做。这可以通过检查每个字符并跟踪-和在O(n)时间内完成。符号并抛出任何非数字字符。使用如下:@bobblebubble misses 1.2.3.4->1.23.4或…1->…1我很确定没有一个str.replace(…)解决方案,因为js正则表达式不支持lookbehind(需要它来匹配前面有其他点的点)。它无法运行这个字符串“4h.-34”,结果是“4.-34”。然而,在结果上运行它修复了问题,结果是4.34。实际上,我在第一次
replace
中缺少了
g
。现在它应该也适用于
4h.-34
。@anubhava这是完美的。非常感谢。另外,感谢您向我展示如何使用捕获的值。我错过了。在连续的时间段内失败,例如,
1..1
。感谢您的评论,现在通过将
+
简单更改为
*
来修复。这非常容易理解和处理。肯定比正则表达式解决方案更容易理解。@Simon,目前比您接受的答案更正确;)
.1
-1
的结果不一致,它们分别给出了
.1
1
。您应该将其作为堆栈片段,以便于测试,但我还没有发现任何错误。