如何在使用PHP和正则表达式时在字符串中大写字母之间添加空格,但保持连续的大写字母在一起?

14

我想使用类似于 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的解决方案,比第二个方案略微快一点。

1个回答

12

查找:

(?<!^)((?<![[:upper:]])[[:upper:]]|[[:upper:]](?![[:upper:]]))

替换:

 $1

注意 $1 前面的空格。

编辑:修正。


我应该使用哪些PHP方法来实现这个正则表达式? - T. Brian Jones
@T.BrianJones:那就是preg_replace - Regexident
当我执行以下代码时,出现了以下错误:preg_replace(): Compilation failed: POSIX named classes are supported only within a class at offset 4echo preg_replace( '((?<![:upper:]|^)[:upper:]|(?<!^)[:upper:](?![:upper:]))', ' $1', $string ); - T. Brian Jones
3
请看修正后的答案。我忘了PHP需要在 :upper: 周围加上双括号,我的错。我的PHP有点生疏,不像我的正则表达式。:P - Regexident

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接