删除大写字母之间的空格,但保留单词之间的空格的正则表达式是什么?

10
例如,如果我有一个字符串“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"

--编辑--

解决方案第一部分:

 value = value.replace(/([A-Z])\s(?=[A-Z])/g, '$1')
感谢 Renato 提供的解决方案的第一部分!我发现如果大写字母后面有一个大写字母,它也会吞掉那个空格。我们该如何保留那个空格呢?
因此,“Hello I B M Dude”变成了“Hello IBMDude”,而不是“Hello IBM Dude”。

有没有办法去掉两个大写单词和/或字母之间的空格,使得 Face Book 变成 FaceBook? - Michael d
1个回答

11

当正则表达式第一次匹配成功(在"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来增加前瞻模式以实现该限制:

为了避免删除下一单词首字母为大写字母时的空格,可以使用单词边界符\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]\b)

1
如果字符串是“Hello I B Groink” - Casimir et Hippolyte
1
运行得像魔法一样...除了一个问题!我刚刚意识到在测试所生成的标题时。例如"Hello I B M Dude"这样的字符串会变成"Hello IBMDude",我该如何防止"M"和"Dude"之间被空格吞没? - Steven Yuan
@StevenYuan - 现在你改变了需求。你要求删除两个大写字母之间的任何空格。如果你不想这样做,新规则是什么? - jfriend00
3
你可以使用 ([A-Z])\s(?=[A-Z]\b)。这是一个正则表达式,用于匹配在大写单词之间的空格,但不匹配单个大写字母的缩写词。 - hwnd
1
@Renato Zannon 有时候最小的事情可能会被忽略 =) - hwnd
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接