首页 > 解决方案 > 使用 PHP Regex 仅替换单个字母而不是成对出现的字母

问题描述

这是输入字符串:

BQ^2*Z*(2*Y + Z) == AP^2*Y^2 - PQ^2*Y^2

这是所需的输出:

BQ^2*$z*(2*$y + $z) == AP^2*$y^2 - PQ^2*$y^2

我尝试使用以下正则表达式:

([A-Z])(?![A-Z])

但是,它只会将第一个字符排除在替换之外。目前的结果是:

B$1^2*$1*(2*$1 + $1) == A$1^2*$1^2 - P$1^2*$1^2

我应该如何更改上述正则表达式以获得正确的输出。

标签: phpregex

解决方案


您可以使用环视正则表达式:

$repl = preg_replace('/(?<![A-Z])[A-Z](?![A-Z])/', '$$0', $str);
//=> BQ^2*$Z*(2*$Y + $Z) == AP^2*$Y^2 - PQ^2*$Y^2

正则表达式演示

正则表达式解释:

  • (?<![A-Z]): Lookbehind 断言我们在前一个位置没有大写字母
  • [A-Z]: 匹配一个大写字母
  • (?![A-Z]): 向前断言我们在下一个位置没有大写字母

附加说明:

对于您给定的输入,以下正则表达式也将起作用:

\b[A-Z]\b

但会错过Y输入匹配:PQ^2*5Y^2


推荐阅读