php按大写字母拆分字符串但忽略TLA。还有TLA在这个词的末尾

时间:2018-02-01 15:14:39

标签: php regex string split

解决方案显然可以是:

$string = 'TodayILiveInTheUSAWithSimon';
$regex = '/(?<!^)((?<![[:upper:]])[[:upper:]]|[[:upper:]](?![[:upper:]]))/';
$string = preg_replace( $regex, ' $1', $string );

但是这个案例&#34; TodayILiveInTheUSAWithSimonUSA&#34;不能很好地运作,因为它回归&#34;今天我和美国一起生活在美国美国A &#34;最后一个字母显示为分开。你知道一个完整的解决方案吗?

3 个答案:

答案 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重置报告的匹配的起点。
  • (?=)积极前瞻

Regex demo

<强>代码

$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

相关问题