首页 > 解决方案 > 正则表达式。我需要用前导零推进我的表达

问题描述

我有我的 RegExp: '^[0-9]{0,6}$|^[0-9]\d{0,6}[.,]\d{0,2}'

我需要升级上面的条件才能使用像“000”这样的输入。它应该格式化为 '0.00' 我希望得到一个输入和输出列表: 输入:[5555, 55.5, 55.55, 0.50, 555555.55, 000005, 005]

输出:[5555, 55.5, 55.55, 0.50, 555555.55, 0.00005, 0.05]

标签: regexdart

解决方案


使用 RegExps 时,重要的是用散文描述您希望它匹配的内容,以及您想要对匹配执行的操作。

在这种情况下,您的 RegExp 匹配一个完全由 0-6 位数字组成的字符串,或者一个以 1-7 位数字开头的字符串,然后是0-2位数字。.,

那就是:要么是一个带有数字但没有,/的字符串,要么是一个带有数字.,/的字符串,.然后是多个(最多 2 个)数字。

然后,您要求转换0000.00. 我你想将数字标准化为没有不必要的前导零和两位小数。(现在有更多的例子,我猜一个前导零且没有小数点的数字应该在第一个零之后添加小数点)。

我同意使用适当的数字格式化程序可能是要走的路,但是既然我们在谈论 RegExps,如果我不得不使用 RegExps,我会这样做:

  • 使用捕获组,因此您可以轻松查看匹配的部分。
  • 使用不捕获前导零的正则表达式。
  • 不要试图计算正则表达式。在侧面的代码中执行此操作(如有必要)。

就像是:

final _re = RegExp(r"^\d{0,6}$|^(\d{1,7}[,.]\d{0,2})");
String format(String number) {
  var match = _re.firstMatch(number);
  if (match == null) return null;
  var decimals = match[1];
  if (decimals != null) return decimals;
  var noDecimals = match[0];
  if (!noDecimals.startsWith('0')) return noDecimals;
  return "0.${noDecimals.substring(1)}";
}

这与您的 RegExp 匹配相同的字符串。


推荐阅读