Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 仅当后跟字符时应用正则表达式_Javascript_Regex_String_Replace - Fatal编程技术网

Javascript 仅当后跟字符时应用正则表达式

Javascript 仅当后跟字符时应用正则表达式,javascript,regex,string,replace,Javascript,Regex,String,Replace,在我的网站上,我处理各种数字(整数和浮点)。例如:.2060 0.2060 100.2060 1000 10000.00 我想在显示它们时插入第千个逗号以提高可读性,所以我使用了这个 但是,我遇到了一个问题,因为它会将像0.2060这样的数字转换为0.2060,所以我需要弄清楚如何只将正则表达式应用于字符前面的字符 有什么想法吗?您只需检查数字是否包含,然后根据该格式确定数字 以下是我尝试的示例代码: const numbers = [ "0.2060", "0.2060", "25

在我的网站上,我处理各种数字(整数和浮点)。例如:
.2060
0.2060
100.2060
1000
10000.00

我想在显示它们时插入第千个逗号以提高可读性,所以我使用了这个

但是,我遇到了一个问题,因为它会将像
0.2060
这样的数字转换为
0.2060
,所以我需要弄清楚如何只将正则表达式应用于
字符前面的字符


有什么想法吗?

您只需检查数字是否包含
,然后根据该格式确定数字

以下是我尝试的示例代码:

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)

好的,你需要得到一个正则表达式来标识小数点前三位数的完整组,这样你就可以用一个带前缀的逗号符号来复制它们。但问题是,您只能控制与正则表达式的匹配,而不能控制替换模式(如果您的模式匹配多个组或不匹配,则情况会有所不同)

第一种尝试是尝试匹配
\d?\d?(\d\d\d)*(\.\d*\\\\124b)
(一个或两个数字,后面是零个或多个三位数组——这是我们感兴趣的),后面是一个小数点和更多的数字(我们对这些数字不感兴趣,因为我们不打算替换它们中的任何一个)或一个单词边界(不允许具有多个点的匹配序列,如(例如012345.2342.1233)

问题是我们这里只有一个感兴趣的组(中央
(\d\d\d)
),但这意味着我们必须与所有其他组一起构造替换模式,并将该组放在某个地方(因此我们的regexp更改为
(\d?\d?)(\d\d\d)*(\.\d\\124;\ b)
,以便我们可以使用
\1、\2\3
作为替换)。这是不正确的,因为我们将在最后一个匹配为
\2
的组前面只放一个逗号,我们需要对每个匹配的组进行替换

下一种方法是在regexp中显式地使用几个组,例如
(\d?\d?)(\d\d?)(\d\d?)…(\d\d?)(\.\d*\\\124b)
,因此我们可以用
、\2
\3
…替换每个组(
\2
、\3
)但这也不起作用,因为你总是把逗号放在它们的位置上,与内部组的匹配无关(给你一些类似
1,,,,,000000000.234566
。当然,你可以采取两步方法,进行两次替换:最后一次替换,另一次将
,+
更改为
(将多个逗号序列转换为单个逗号)

唯一的方法是实际匹配
\d\d\d
,并用
,\0
替换匹配。但这次我们又遇到了麻烦,因为我们必须拥有整个数字字符串,因为组最终开始,这是我们需要从正则表达式中分离出来的上下文信息

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


正如你在书中提到的问题的一个答案中所建议的,最好的方法是使用另一种方法,如(使用
tolocalString()
javascript方法)

对不起,我的例子不清楚。我也可能最终得到像
100.0250
5000.1056
这样的数字更新了答案!啊,聪明,我可以简单地拆分和重新加入(并应用
.toFixed(n)
拆分前乐意帮助:Dyeah,如果有人能解释我的问题被否决的原因,那就太好了。这似乎有点太复杂了。没有办法简单地通过向前看或向后看来检测
字符,如果它检测到前面的
字符或允许如果检测到<代码>接下来是什么?我通常不提及lookaheads和lookbehinds,因为这不是正则表达式问题。它需要回溯和重新分析,因此不属于它。无论如何,解决方案需要匹配重叠匹配,下一次替换必须要知道最后一次在哪里完成(上下文依赖)因此,这不适合用一个正则表达式进行解析