我想使用类似于 preg_replace()
和正则表达式的 PHP 方法,在大写字母上添加空格,但只想在它们连续出现时在第一个大写字母前面加一个空格。 我还希望正则表达式知道连续大写字母中的最后一个大写字母应该是前一个大写字母之后的下一个大写字母。
以下是示例字符串:
TodayILiveInTheUSAWithSimon USAToday IAmSOOOBored
转化为:
Today I Live In The USA With Simon USA Today I Am SOOO Bored
这个问题似乎可以使用 .net 实现,具体方法可以参考这个问题:Regular expression, split string by capital letter but ignore TLA。
有效解决方案:
以下是我使用的完整代码:
$string = 'TodayILiveInTheUSAWithSimon';
$regex = '/(?<!^)((?<![[:upper:]])[[:upper:]]|[[:upper:]](?![[:upper:]]))/';
$string = preg_replace( $regex, ' $1', $string );
这两个正则表达式都可以工作:
/(?<!^)((?<![[:upper:]])[[:upper:]]|[[:upper:]](?![[:upper:]]))/
/((?<=[a-z])(?=[A-Z])|(?=[A-Z][a-z]))/
第一个方案来自@Regexident的解决方案,比第二个方案略微快一点。
preg_replace(): Compilation failed: POSIX named classes are supported only within a class at offset 4
:echo preg_replace( '((?<![:upper:]|^)[:upper:]|(?<!^)[:upper:](?![:upper:]))', ' $1', $string );
- T. Brian Jones:upper:
周围加上双括号,我的错。我的PHP有点生疏,不像我的正则表达式。:P - Regexident