解决方案显然可以是:
$string = 'TodayILiveInTheUSAWithSimon';
$regex = '/(?<!^)((?<![[:upper:]])[[:upper:]]|[[:upper:]](?![[:upper:]]))/';
$string = preg_replace( $regex, ' $1', $string );
但是这个案例&#34; TodayILiveInTheUSAWithSimonUSA&#34;不能很好地运作,因为它回归&#34;今天我和美国一起生活在美国美国A &#34;最后一个字母显示为分开。你知道一个完整的解决方案吗?
答案 0 :(得分:1)
(?<!^)(?![[:upper:]]$)((?<![[:upper:]])[[:upper:]]|[[:upper:]](?![[:upper:]]))
添加一个否定的预测,以确保它也不匹配字符串末尾的大写。
你唯一想要将其分开的唯一情况是,如果你以一个字母单词结束,这是不可能的,所以不应该有太多的反弹
答案 1 :(得分:0)
如果您只想跳过所有3个大写字母然后使用PHP(PCRE),您可以使用此正则表达式:
(?<=[A-Z])[A-Z]{2}(*SKIP)(*F)|(?<=[A-Za-z])(?=[A-Z])
<强>代码:强>
$re = '/(?<=[A-Z])[A-Z]{2}(*SKIP)(*F)|(?<=[A-Za-z])(?=[A-Z])/';
$result = preg_replace($re, ' ', $str);
<强>解释强>
(?<=[A-Z])[A-Z]{2}(*SKIP)(*F)
:如果我们匹配2个大写字母并且在前一个位置有一个大写字母,那么跳过(失败)该模式|
:或(?<=[A-Za-z])(?=[A-Z])
:如果在以前的位置有任何字母并且在下一个位置有一个大写字母答案 2 :(得分:0)
正则表达式:(?:[A-Z]+|[A-Z][a-z]+)\K(?=[A-Z])
替换:" "
(空格)
<强>详情:
(?:)
非捕获组[]
匹配列表中的单个字符+
匹配一次且无限次|
或\K
重置报告的匹配的起点。(?=)
积极前瞻<强>代码强>:
$text = 'TodayILiveInTheUSAWithSimon';
$text = preg_replace("/(?:[A-Z]+|[A-Z][a-z]+)\K(?=[A-Z])/", " ", $text);
print_r($text);
输出:Today I Live In The USA With Simon