用于匹配多行 PHPDoc 注释的正则表达式

问题描述

/**
 * Get Data
 *
 * @param null|ProductInterface $product
 *
 * @return string
 * @throws LocalizedException
 * @throws NoSuchEntityException
 */

我想使用正则表达式找到 PHPDoc 多行,这样不同类型的 PHPDoc @ 元素之间就没有空行。例如,在

之间

** @return 字符串
** @throws LocalizedException

相反:

** @param null|ProductInterface $product
**
** @return 字符串

如果您想知道我为什么需要它 - 我必须在不同类型的 PHPDoc @ 元素(在这种情况下为 @param 和 @throws)之间添加一个新的空行。

解决方法

这样的事情可以工作:

正则表达式:

^ \* @([a-z]+).*\K(?=\r?\n^ \* @(?!\1))
  • ^ \* @([a-z]+).* - 捕获 PHPDoc 行并将 @ 之后的任何内容放入捕获组 \1
  • \K - 忘记我们刚刚捕获的所有内容,但 \1 仍然可用
    • \K 特定于 PCRE
    • 在替换中,我不想处理捕获组,所以我的目标是在我想​​添加新行的地方声明我的位置
  • (?=\r?\n^ \* @(?!\1)) - 在我前面应该是另一个 PHPDoc 行,并且 @ 之后的文本不允许与 \1 中存储的内容相同

替换:

\n *

https://regex101.com/r/nZpgkF/1

^ 我修改了测试字符串以拆分多个内容,以便您可以看到它是如何工作的。


如果 \K 在您的正则表达式风格中不可用:

正则表达式

(^ \* @([a-z]+).*)(?=\r?\n^ \* @(?!\2))

替换:

$1\n *

https://regex101.com/r/DZ5EKw/1