【问题标题】:JavaScript regex for adding space between numbers and operator symbols in a string [duplicate]用于在字符串中的数字和运算符符号之间添加空格的 JavaScript 正则表达式 [重复]
【发布时间】:2020-09-22 00:41:50
【问题描述】:

我有一个包含数字和运算符符号的字符串,例如:99*8998+-999 我需要在运算符和相邻数字之间留一个空格,如下所示:99 * 8998 +- 999

我尝试了 JavaScript replaceAllregex/(\d+)([/*+-]+)(\d*)/g 但是这个正则表达式可以正常工作,直到字符串中没有不相邻的运算符符号。

例如参考以下工作和非工作条件。

"998998+999".replaceAll(/(\d+)([/*+-]+)(\d*)/g, "$1 $2 $3")  
=> "998998 + 999" // Works as expected

"998998+-999".replaceAll(/(\d+)([/*+-]+)(\d*)/g, "$1 $2 $3") 
=> "998998 +- 999" // Works as expected

"99*8998+-999".replaceAll(/(\d+)([/*+-]+)(\d*)/g, "$1 $2 $3") 
=> "99 * 8998+-999" // Does not works as expected. Expected: "99 * 8998 +- 999"

即使带有global 标志,正则表达式似乎在第一次匹配后返回而没有捕获下一个匹配。

可能出了什么问题?

【问题讨论】:

  • 您可以在正向前瞻中更改最后一组 (\d+)([\/*+-]+)(?=\d) regex101.com/r/v53RVq/1
  • 也许只是.replace(/\s*([\/*+-]+)\s*/g, " $1 ")
  • 尾随的(\d*) 没有多大意义,因为该部分无论如何都会匹配,还不如把它去掉?
  • 谢谢你们,只是好奇为什么我的初始正则表达式没有捕获多个匹配项?还是根本没有匹配?

标签: javascript regex


【解决方案1】:

您的方法不起作用的原因是因为您的正则表达式正在匹配并使用表达式中的字符,例如:12+34-1,它具有重叠匹配。因此,您将不得不使用零宽度前瞻,它只会前瞻,但不会消耗输入中的字符。

您可以使用此正则表达式进行匹配:

/(\d)(\+-|[\/*+-])(?=\d)/g

使用"$1 $2 "替换

RegEx Demo

您的情况可能还有其他 2 个字符运算符。在上面的示例中,我只使用了+-。您可以在上面的第二个捕获组中交替添加。

正则表达式详细信息:

  • (\d):匹配并捕获组#1中的一个数字
  • (\+-|[\/*+-]):匹配 +- 或单个字符运算符 /*+-
  • (?=\d): 肯定前瞻断言前面有一个数字

【讨论】:

    猜你喜欢
    • 2019-10-16
    • 2018-04-30
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多