如何在限定大写字母后插入句号?

How to insert period after qualifying capitalized letters?

如何根据以下规则在任何未跟大写字母的大写单个字母后插入句点:

  1. 后面跟着一个space;或者
  2. 后面又是一个大写字母;或者
  3. 它是字符串中的最后一个字母,前面是 space 或大写字母

样本Inputs/Outputs:

Patrick TJ Stephens 变为 Patrick T.J. Stephens
TJ Stephens 变为 T.J. Stephens
TJ Stephens QC 变为 T.J. Stephens Q.C.
Marissa C J Gilbert 变为 Marissa C. J. Gilbert
Marissa C Gilbert 变为 Marissa C. Gilbert
C Marissa Gilbert 变为 C. Marissa Gilbert
Marissa Gilbert C 变为 Marissa Gilbert C.

我一直在使用:

$str = preg_replace( '/([A-Z])(?=\s|$)/', '.', $str );

不幸的是,它将 Patrick TJ Stephens 变成 Patrick TJ. Stephens 而不是 Patrick T.J. Stephens

您可以使用:

$str = preg_replace('/[A-Z](?![a-z.])\K/', '.', $str);

不确定它是否符合您的规则,但它确实起作用了。

或者这个:[A-Z](?![^A-Z\s])\K

翻译您的所有要求需要先行和后行,因为此正则表达式:

$str = preg_replace('/(?<=[\hA-Z])[A-Z]$|[A-Z](?=[\hA-Z])/m', '[=10=].', $str);

RegEx Demo

尽管这个正则表达式比

更复杂

还有一个傻瓜版,作者是傻瓜我:)

  $str = preg_replace(
        array(
               '/([A-Z])(?=\s|$)/',
               '/([A-Z])([A-Z])/'
        ),
        array(
               '.',
               '.'
        ),
  $str );

这是demo