7

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

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

- 编辑 -

解决方案第 1 部分:

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

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

所以“Hello IBM Dude”变成了“Hello IBM Dude”而不是“Hello IBM Dude”

4

1 回答 1

10

当正则表达式第一次匹配时(on "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 所指出的,必须将以下字母设为可选,否则如果字符串的最后一个字符为大写,则第二个正则表达式将不起作用。因此,pattern([^A-Za-z]|$)可以理解为“不是字母,也不是字符串的结尾”。

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

于 2013-11-05T23:54:11.567 回答