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

时间:2013-11-05 23:44:16

标签: javascript regex string replace

例如,如果我有一个像“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”

1 个答案:

答案 0 :(得分:9)

当正则表达式第一次匹配时(在"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)简化预测