1

我有两个单词组合在一起 KitnerCoster ,我想在中间添加一个空格,如果分隔两个都大写的单词,有没有人知道的任何技巧,这是唯一的区别。

4

2 回答 2

4

使用正则表达式,您可以执行类似的操作

s/([a-z])([A-Z])/'$1 $2'/g

但是,我第一次尝试编写正则表达式通常会失败,因此您可能必须更正其中的一部分。

你想如何处理一个 1 字符长的单词?就像 FooXBar 中的“X”?上述正则表达式不会将 X 识别为单独的单词。

于 2010-08-06T13:53:18.100 回答
3

你关心第一个单词是否大写?如果没有,做

// ASCII
preg_replace('/([a-z])([A-Z])/', '$1 $2', $string)
preg_replace('/([[:lower:]])([[:upper:]])/', '$1 $2', $string)

// Unicode (UTF-8)
preg_replace('/(\p{Ll})(\p{Lu})/u', '$1 $2', $string)

如果您确实在乎,并且想修复KitnerCostner但不理会kitnerCostner,那就做

// ASCII
preg_replace('/\b([A-Z]\S*[a-z])([A-Z])/', '$1 $2', $string)
preg_replace('/\b([[:upper:]]\S*[[:lower:]])([[:upper:]])/', '$1 $2', $string)

// Unicode (UTF-8)
preg_replace('/\b(\p{Lu}\S*\p{Ll})(\p{Lu})/u', '$1 $2', $string)

我给出了只匹配 ASCII 字母和匹配所有 Unicode 字符的版本。Unicode 的在 PHP 5.1.0 中可用。

于 2010-08-06T13:57:21.057 回答