JavaScript:从字符串中删除所有连续出现的字符

3
我希望能从字符串中移除连续出现的两个特定字符:句点和负号。例如,如果我们有字符串 -123-456.78.9.0-12,那么最终应该得到的结果是 -123456.789012。这个问题可以通过正则表达式替换来解决吗?
如果我可以补充一下,我的完整目标是只允许数字、负号和句点,其中负号只允许作为第一个字符或者根本不存在。
非常感谢。

你应该避免自动更正无效的数字,因为这可能会导致意外的错误。可以设置一些适当的规则来接受千位分隔符和小数点分隔符。 - Marcin Malinowski
3个回答

4
您可以通过3个“replace”调用来完成此操作:

function repl(n) {
   return n.replace(/[^\d.-]+/g, '') // remove all non-digits except - and .
           .replace(/^([^.]*\.)|\./g, '$1') // remove all dots except first one
           .replace(/(?!^)-/g, '') // remove all hyphens except first one
}

console.log(repl('-123-456.78.9.0-12'))
//=> "-123456.789012"

console.log(repl('-123-#456.78.9.0-12-abc-foo'))
//=> "-123456.789012"

console.log(repl('-1234'))
//=> "-1234"

console.log(repl('@-123-#456.78.9.0-12-abc-foo'))
//=> "-123456.789012"

这里:

  1. 第一个 replace 方法是替换除了 -. 以外的所有非数字字符。
  2. 第二个 replace 方法是替换除了第一个点以外的所有点。
  3. 第三个 replace 方法是替换除了第一个连字符以外的所有连字符。

2
这似乎不能处理负数,我只得到正数结果。 - Pluto
1
你为什么会得到这些赞?OP无法将负号限制为第一个字符,但却想删除 [^\d.-]。这太荒谬了。这个方法失败得很惨。@-123-#456.78.9.0-12-abc-foo - user557597
1
不要自己创造要求,并阅读问题,其中写着“只允许负号作为第一个字符或根本不存在”。 - anubhava
由于这个垃圾 ebqefbqfbebqebfqeagb<here>-22 被删除并不是数字的一部分,为什么 -22 不是前导负号呢?我认为你在迁就那个有点混淆的 OP!! - user557597
1
好的,将函数更改为 function repl(n) { return n.replace(/[^\d.-]+/g, '').replace(/^([^.]*\.)|\./g, '$1').replace(/(?!^)-/g, '') } 然后它应该可以工作了。 - anubhava

0
如果你想避免使用正则表达式,可以尝试像这样做:
let str = '-123-456.78.9.0-12';

let output = '';
if (str[0] == '-') output += '-';
let periodIdx = str.indexOf('.');
for (let idx = 0; idx < str.length; idx += 1) {
    let char = str.charCodeAt(idx);
    if (char > 47 && char < 58) output += str[idx];
    if (idx == periodIdx) output += '.';
}

console.log(output);

0
如果我可以补充一下,我的完整目标只是允许数字、负号和小数点,负号只允许作为第一个字符或根本不存在。
^-?[^.-]*\.?[^.-]*$

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接