【问题标题】:regex to add spaces in specific places正则表达式在特定位置添加空格
【发布时间】:2017-12-10 09:15:16
【问题描述】:

我有一个 14 位长的号码,我需要拆分成这种格式:

xxx xxx xxx xxxxx

我有一个正则表达式,从末尾开始每 3 个字符拆分一次(因为前瞻?)

(?=(\d{3})+(?!\d))

这给了我:

xx xxx xxx xxx xxx

我尝试在 regex101.com 中使用lookbehind,但出现模式错误...

(?<=(\d{3})+(?!\d))

如何使用lookbehind 使其从字符串的开头开始(如果这是我的问题)以及如何仅重复该模式3 次然后切换到\d{5}

【问题讨论】:

  • 最好的答案可能是'不要为此使用正则表达式'......一个简单的for循环可能要容易得多。
  • 你可以试试这个正则表达式来检查最终结果regex101.com/r/3dltJm/4(^\+|\d{3} |\d{5}$)
  • “我怎样才能使用lookbehind以便它从字符串的开头开始”-我不认为JavaScript Regex具有lookbehind功能。

标签: javascript regex


【解决方案1】:

试试这个:

(\d{3})(\d{3})(\d{3})

并替换为:

"$1 $2 $3 "

Regex 101 demo

const regex = /(\d{3})(\d{3})(\d{3})/g;
const str = `12345678901234`;
const subst = `$1 $2 $3 `;
const result = str.replace(regex, subst);
console.log( result);

【讨论】:

  • 我似乎看得太多了,忘记了替换。谢谢。
【解决方案2】:

你可以这样使用:https://regex101.com/r/yqmyvs/3

这个的正则表达式:

(?:\d{3})(?:\d{2}$)?

这基本上是说:我想要三个数字组成的组,除非它是字符串的结尾,在这种情况下我想要 5。

不过,正如对您的问题所评论的那样,这实际上并不是您通常会使用正则表达式的东西。

【讨论】:

  • 我建议使用 /([\d]{3}(?:\d{2}$)?)/。在我的测试脚本 preg_split() 中,最后也捕获了“34”。这就是我在最后一个子模式中添加 ?: 的原因,因此它不会被放入拆分数组中。
  • @Bernhard 我已经更新它以停止使用捕获组,因为它们实际上并没有被使用
  • 我无法满足我的需要。它确实选择了正确的组,但是如何在它们之间插入空格? (不,for 循环绝对不是这样做的正确方法)
  • 你得到所有的匹配然后用空格加入它们?
猜你喜欢
  • 2023-04-06
  • 2016-05-17
  • 1970-01-01
  • 2015-04-01
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
  • 1970-01-01
相关资源
最近更新 更多