【问题标题】:Javascript Regex remove spaces around dash in numbers but not stringsJavascript Regex 删除数字中破折号周围的空格,但不删除字符串
【发布时间】:2023-03-24 16:15:01
【问题描述】:

我正在尝试删除字符串中破折号周围的空格,但仅限于数字内:

10 - 89 - 90 应该变成10-89-90

但是当在一个字符串中时,它们应该保留空格:

A - Z 应保持为A - Z。以及90 - older 应该保留90 - older

所以只有当破折号两边都有数字时,才应该删除空格。

我试过了:

item = item.replace(/(\d) - (\d)/g, "$1-$2");

但什么也没发生。

编辑:我的破折号确实被 Excel 变成了破折号,但我接受了答案,因为它确实预料到了我很可能遇到的问题(破折号之间只有一位数字) .

【问题讨论】:

  • 这很可能是因为您的空间是硬/非中断空间。或者你的破折号不是连字符,而是一些 en/em-dash 因为your code works
  • @tevemadar 不需要。实际上,第二个\d 必须用前瞻包装以允许重叠数字匹配,如第四只鸟的答案。这里的问题是我们不知道 OP 有什么作为输入,或者空格不是常规空格,或者连字符/破折号。 \s 解决了空格问题。
  • @WiktorStribiżew,是的,毕竟匹配一个数字就足够了。但事实上,OP 的原始代码已经适用于该示例(替换了 ``` - ``` 序列),而帖子说它没有。 (在 SO 中发现了一个错误?我无法用周围的空格对破折号进行编码格式化)

标签: javascript regex


【解决方案1】:

使用(\d) - (\d) 将适用于10 - 89 - 90,但不适用于10 - 8 - 9,因为第二个\d 中的单个数字已经匹配。

每个数字的左右两边也必须至少有一个空格,这也与10 - 89 -90中的最后一个空格不匹配

你可以使用

\b(\d+)\s*-\s*(?=\d+\b)
  • \b(\d+)一个词的边界,捕获1+个数字
  • \s*-\s* 匹配可选空白字符之间的连字符
  • (?=\d+\b) 正向前瞻,断言 1+ 位数字后跟一个字边界

并替换为

$1-

Regex demo

[
  "0 - 89 - 90",
  "90 - older"
].forEach(
  item => console.log(item.replace(/\b(\d+)\s*-\s*(?=\d)/g, "$1-"))
)

当支持lookbehind中的量词时:

[
  "0 - 89 - 90",
  "90 - older"
].forEach(
  item => console.log(item.replace(/(?<=\b\d+)\s*-\s*(?=\d+\b)/g, "-"))
)

【讨论】:

  • 解释?我假设您现在正在编辑以添加一个,但以防万一。
  • @Slbox 很快就到了
  • 谢谢一百万。这可能是 JavaScript 问题,但我必须删除 \b 字边界才能使其正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 1970-01-01
  • 2016-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多