php - 使用 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
我应该如何更改上述正则表达式以获得正确的输出。
解决方案
您可以使用环视正则表达式:
$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
推荐阅读
- python - 选择 pandas DataFrame 中的列子集与元组匹配的位置
- javascript - 在对象 ES6 中反应数组的 setState
- html - 我可以改进什么来做出响应式设计
- bash - bash:fifo 队列与羊群
- r - 根据条件分配值 1 或 0
- spring - Spring Boot Controller 测试:模拟服务需要下游对象导致 ApplicationContext 无法加载
- python - 不断收到 ValueError:传递值的形状为 (4474, 10),索引暗示 (14084, 10)
- text - 如何在给定宽度的小部件中移动文本
- c++ - 如何格式化 QTableWidget 中的单元格
- python - 如何在 Keras 代码生成的 tensorboard 中构造图形?