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

Ste*_*uan 6 javascript regex string replace

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

基本上"Hello IB M"应解析为"Hello IBM"

到目前为止,我有这个:

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

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

- 编辑 -

解决方案第1部分

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

感谢Renato解决方案的第一部分!刚刚发现大写字母后面是否有大写单词,它也会吞下那个空格.我们如何保留那里的空间?

所以"Hello IBM Dude"成为"Hello IBMDude"而不是"Hello IBM Dude"

Ren*_*non 9

当正则表达式匹配第一次(打开"A B")时,引擎消耗的字符串的这一部分,因此即使你的正则表达式具有global('g')标志,它也不会再次匹配.

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

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

如果下一个大写字母是单词中的第一个字母,则不要删除空格,可以使用单词边界增加先行模式\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"
Run Code Online (Sandbox Code Playgroud)

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

编辑:从简化先行(?=[A-Z]([^A-Za-z]|$))(?=[A-Z]\b)所建议@hwnd

  • 你可以使用`([AZ])\ s(?= [AZ]\b)` (3认同)
  • 第二个模式不适用于第一个字符串. (2认同)