字符串替换所有非正则表达式

时间:2019-06-28 09:50:57

标签: javascript regex

这是我的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})$/, ''),但没有成功

4 个答案:

答案 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).*)$

Regex demo

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