仅当字符后才应用正则表达式

时间:2018-09-03 17:39:17

标签: javascript regex string replace

在我的网站上,我正在处理各种数字(整数和浮点数)。以下是一些示例:.2060 0.2060 100.2060 1000 10000.00

我想在显示它们时插入千位逗号以提高可读性,所以我正在使用此RegEx solution

但是,我遇到了一个问题,因为它将把0.2060这样的数字转换为0.2,060,所以我需要弄清楚如何仅将RegEx应用于{{1}之前的字符}。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您可以简单地检查数字是否包含.,并根据该格式检查数字。

这是我尝试的示例代码:

const numbers = [
  "0.2060",
  "0.2060",
  "2500",
  "2500000",
  "100.0250",
  "5000.1056"
]

const numberWithCommas = (x) => {
  return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}

const formatted = numbers.map(aNumber => {
  const split = aNumber.split(".");
  split[0] = numberWithCommas(split[0]);
  return split.join('.');

});

console.log(formatted)

答案 1 :(得分:0)

那么,您需要获得一个正则表达式,该正则表达式可以标识小数点前三位数的完整组,因此您可以使用前置的逗号符号来复制它们。但是问题是您只能用正则表达式控制匹配,而不能控制替换模式(如果您的模式匹配多个组,替换模式会有所不同)

第一个尝试是尝试匹配\d?\d?(\d\d\d)*(\.\d*\|\b)(一个或两个数字,然后匹配零个或多个三位数的组---这是我们感兴趣的),然后匹配一个小数点或更多数字(我们对这些数字不感兴趣,因为我们不愿意替换其中的任何数字)或字词边界(不允许与多个点(例如012345.2342.1233)匹配的序列

问题是这里我们只有一个兴趣组 (中央(\d\d\d)),但这意味着我们必须用其余所有内容构建替换模式并将该组放置在某个位置(因此我们的正则表达式更改为(\d?\d?)(\d\d\d)*(\.\d\|\b),因此我们可以使用\1,\2\3作为替代)。这是不正确的,因为我们只会在匹配为\2的最后一个组的前面放置一个逗号,并且我们需要为每个匹配的组进行替换。

下一种方法是在正则表达式中显式使用几个组,例如(\d?\d?)(\d\d\d)?(\d\d\d)?...(\d\d\d)?(\.\d*\|\b),因此我们可以用\2替换每个组(\3,\2 ... ,,\3 ...),但这还是行不通的,因为您总是将逗号放在它们的位置,而与内部组的匹配无关(给您类似1,,,,000,000,000.234566之类的东西。当然,您可以执行两步方法,进行两次替换:最后一次替换,以及将,,+更改为,(将多个逗号序列更改为单个逗号)的方法

然后,唯一的方法是实际匹配\d\d\d,然后用,\0代替匹配。但是这一次我们又遇到麻烦了,因为必须有完整的数字字符串,因为组必须从末尾开始,这是我们需要与正则表达式隔离的上下文信息。

唯一有效的解决方案是识别与感兴趣的数字序列匹配的字符串(数字字符串前没有点且具有三个以上的数字,例如(^\|[^.\n])(\d\d\d\d*),然后对其进行所有替换。当心,因为您必须从右边开始并向左走,所以必须这样做一次(搜索最后一组三位数\d\d\d$并将其更改为,\0

正如您所提到的问题的答案之一所建议的那样,最好的方法是使用替代方法,例如this(使用toLocaleString() javascript方法)