我试图找出一个允许字符串的正则表达式模式但删除任何非数字,jekyll build
或前导.
的内容。
我正在寻找最简单的方法来删除任何非"数字"字符串中的变量。这个解决方案不一定是正则表达式。
这意味着它应该转
-
规则是第一个句点是小数点,并且应删除后面的每个句点。字符串中应该只有一个减号,它应该在前面。
我当时认为应该有一个正则表达式,但我无法绕过它。我发现的大多数正则表达式解决方案允许第二个小数点保持不变。
答案 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;
答案 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)
好的弱尝试但看起来很好......
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;