【问题标题】:Negative match regex for positive and negative numbers with decimals带小数的正数和负数的负匹配正则表达式
【发布时间】:2020-12-02 03:20:58
【问题描述】:

我有正则表达式,它确保任何不符合以下条件的字符都被空字符串替换:

  • 必须是数字。
  • 可以是正数或负数。
  • 可选地可以有十进制值,但不能有尾随小数点。

我的问题:如果发现数字前面的负号,我无法弄清楚如何保留它。我的正则表达式当前用一个空字符串替换了“-”的所有实例。 我在这里遗漏了一些东西以确保不会发生此问题

var testId = document.getElementById('test');

var validate = value => {
  let regex = /([^\d.-]+)|([^\.?\d]+)/g;

  return value.toString().trim().replace(regex, '');
};

// Note: in comments, the expected output
var values = [
  '12345', // 12345
  '-12345', // -12345
  '12345.6789', // 12345.6789
  '-12345.6789', // -12345.6789
  '-123-45.-6789', // -12345.6789
  '$12345a6', // 123456
  '-1abcde+^~2345.6*#zZ789', // -12345.6789
  '50-00', // 5000
  '$12345' // 12345
];

values.forEach(value => {
  testId.innerHTML += `<p>${value} ==> ${validate(value)}</p>`;
});
&lt;div id="test"&gt;&lt;/div&gt;

【问题讨论】:

  • @anubhava 现在将添加到上面
  • 试试return value.toString().trim().replace(/[^\d.-]+/g, '').replace(/^([^-]*)(-)|-/g, '$2$1');
  • @WiktorStribiżew 测试值 50-00 ==> -5000 我认为应该改为 5000,不过这个想法很不错
  • 所以,return value.toString().trim().replace(/[^\d.-]+/g, '').replace(/^(-)|-/g, '$1');
  • 太好了,请随意添加这个作为答案,如果您不介意解释,我不完全理解第二个正则表达式的工作原理

标签: javascript regex ecmascript-6


【解决方案1】:

你可以使用

return value.toString().trim().replace(/[^\d.-]+/g, '').replace(/^(-)|-/g, '$1');

这里,

  • .replace(/[^\d.-]+/g, '') - 删除除数字、点和连字符以外的所有字符
  • .replace(/^(-)|-/g, '$1') - 仅保留字符串中的第一个连字符并删除所有其他连字符。关键是(-) 将开头的连字符(^ 表示字符串的开头)捕获到第 1 组中,您可以使用替换模式中的$1 反向引用访问该组,|- 表示“或连字符只会在非初始位置匹配。

查看 JavaScript 演示:

var testId = document.getElementById('test');

var validate = value => {
  return value.toString().trim().replace(/[^\d.-]+/g, '').replace(/^(-)|-/g, '$1');
};

// Note: in comments, the expected output
var values = [
  '12345', // 12345
  '-12345', // -12345
  '12345.6789', // 12345.6789
  '-12345.6789', // -12345.6789
  '-123-45.-6789', // -12345.6789
  '$12345a6', // 123456
  '-1abcde+^~2345.6*#zZ789', // -12345.6789
  '50-00', // 5000
  '$12345' // 12345
];

values.forEach(value => {
  testId.innerHTML += `<p>${value} ==> ${validate(value)}</p>`;
});
&lt;div id="test"&gt;&lt;/div&gt;

【讨论】:

    猜你喜欢
    • 2016-05-11
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多