这是我的javascript正则表达式:/^(\d+\.?\d{0,2})$/
我的目标是根据它替换所有输入。那可能吗?示例:
123a.12 => 123.12
aaa12aa => 12
12.aaa13 => 12.13
12.aaa => 12
12.555 => 12.55
12.... => 12
12. => 12
12.35.12.14 => 12.35
12.aaa.2.s.5 => 12.25
我正在使用str.replace(/^(\d+\.?\d{0,2})$/, '')
,但没有成功
答案 0 :(得分:2)
按步骤进行:首先替换非数字的任何内容,然后修剪.
:
function getNum(input, expected){
num = input
.replace(/[^\d.]/g, '')
.replace(/\.+$/, '')
.replace(/^\.+/, '');
console.log(input + ' => ' + num + ' | ' + expected)
}
getNum('123a.12', '123.12');
getNum('aaa12aa', '12');
getNum('12.aaa13', '12.13');
getNum('12.aaa', '12');
getNum('abcd.12', '12');
getNum('abcd.efg.12.abcd.efg', '12');
答案 1 :(得分:2)
您当前示例的一个选择是使用替代来匹配非数字,点或空格字符,或者匹配一个点后跟1+个非数字,并断言它不以数字结尾。
[^\d.\s]+|\.[^\d]+(?!\d)\b
[
"123a.12",
"aaa12aa",
"12.aaa13",
"12.aaa "
].forEach(str => console.log(str.replace(/[^\d.\s]+|\.[^\d]+(?!\d)\b/g, '')));
在更新问题后进行编辑
要获取不带尾点和2个小数的值,可以使用replace和回调函数。
首先使用[^\d.]+
使用一种模式来获取第一个点和后两个数字。通过检查第一个组以外的任何其他组的值,使用捕获组来返回所需的匹配项。
^(\d+)(?:\.+|(\.)\.*(\d)\.*(\d).*)$
strings = [
"123a.12",
"aaa12aa",
"12.aaa13",
"12.aaa",
"12.555",
"12....",
"12.",
"12.35.12.14",
"12.aaa.2.s.5"
].map(str => {
return str
.replace(/[^\d.]/g, '')
.replace(/^(\d+)(?:\.+|(\.)\.*(\d)\.*(\d).*)$/, function(m, g1, g2, g3, g4) {
return undefined !== g2 ? g1 + g2 + g3 + g4 : g1;
});
});
console.log(strings);
答案 2 :(得分:1)
您可以使用占位符替换第一个.
,我已经使用过|
。然后,删除所有不是数字或占位符的字符。最后,将占位符替换为.
。然后,删除2位小数点后的所有内容:
const num = (s) => {
const clean = s.replace(".", "|").replace(/[^\d|]/g, '').replace('|', '.');
return parseInt(clean * 100) / 100;
}
const tests = [
"123a.12",
"aaa12aa",
"12.aaa13",
"12.aaa",
"12.555",
"12....",
"12.",
"12.35.12.14",
"12.aaa.2.s.5"
];
tests.forEach(test => console.log(test + " => " + num(test)));
答案 3 :(得分:0)
这应该处理所有情况,除非连续出现两个句点。
let myString = 'test1.0.test'
myStr.replace(/[^\d.-]/g,'').replace(/[^\d.-]|\.$/g, '')
// 1.0