例如,如果我有一个像“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”
答案 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)
简化预测