【问题标题】:What is a regular expression for removing spaces between uppercase letters, but keeps spaces between words?什么是删除大写字母之间空格但保留单词之间空格的正则表达式?
【发布时间】:2013-11-17 01:21:38
【问题描述】:

例如,如果我有一个像“Hello I B M”这样的字符串,我如何检测大写字母之间的空格,而不是“o”和“I”之间的空格?

基本上“Hello I B M”应该解析为“Hello IBM”

到目前为止,我有这个:

value = "Hello I B M"
value = value.replace(/([A-Z])\s([A-Z])/g, '$1$2')

但它只替换两个大写字母之间的第一个空格,例如:“Hello IB M”

--编辑--

解决方案第 1 部分:

 value = value.replace(/([A-Z])\s(?=[A-Z])/g, '$1')

感谢 Renato 提供解决方案的第一部分!刚刚发现在大写字母之后是否有大写单词,它也会吞噬该空间。我们如何保护那里的空间?

所以“Hello I B M Dude”变成了“Hello IBMDude”而不是“Hello IBM Dude”

【问题讨论】:

  • 有没有办法去掉两个大写单词和/或字母之间的空格,让Face Book变成FaceBook?

标签: javascript regex string replace


【解决方案1】:

当正则表达式第一次匹配时(在"A B"),这部分字符串被引擎消耗,因此它不会再次匹配,即使您的正则表达式具有全局('g')标志。

您可以通过使用积极的前瞻 ((?=PATTERN)) 来实现预期结果,这不会消耗匹配:

value = "Hello I B M"
value = value.replace(/([A-Z])\s(?=[A-Z])/g, '$1')
console.log(value) // Prints "Hello IBM"

如果下一个大写字母是单词中的第一个字母,要使其不删除空格,您可以使用单词边界\b 来增加先行模式以进行限制:

value = "Hello I B M Dude"
value = value.replace(/([A-Z])\s(?=[A-Z]\b)/g, '$1')
console.log(value) // Prints "Hello IBM Dude"

注意:正如@CasimirHyppolite 所指出的,必须将以下字母设为可选,否则如果字符串的最后一个字符为大写,则第二个正则表达式将不起作用。因此,模式([^A-Za-z]|$),可以理解为“不是字母,也不是字符串的结尾”。

编辑:按照@hwnd 的建议,将前瞻从(?=[A-Z]([^A-Za-z]|$)) 简化为(?=[A-Z]\b)

【讨论】:

  • 如果字符串是"Hello I B Groink"
  • 像魅力一样工作......除了一件事!在针对我生成的标题进行测试时,我才意识到。像“Hello I B M Dude”这样的字符串变成“Hello IBMDude”如何防止“M”和“Dude”之间被吞下的空间?
  • @StevenYuan - 现在您正在更改要求。您要求删除两个大写之间的任何空间。如果您不想这样做,新规则是什么?
  • 你可以使用([A-Z])\s(?=[A-Z]\b)
  • @Renato Zannon 有时可以忽略最小的事情 =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多