在换行符上使用非常特定的模式进行正则表达式故障排除

Regex troubleshooting with very specific pattern on newlines

我正在尝试操作 PHP 中的字符串以完成以下操作:

示例输入:

"""
line1\n
\n
line2\n
\n
\n
\n
line3\n
\n
\n
\n
\n
line4\n
\n
line5
"""

期望的输出:

"""
line1\n
line2\n
\n
line3\n
\n
line4\n
line5
"""

到目前为止,为了在我的 javascript 中实现这一点,我有:text.split('\n\n').join('\n') 而在 PHP 方面,我使用了这个表达式:preg_replace('~(\R{2})\R+~', '', $text)

这两种方法都可以,但这个过程看起来很时髦,而且由于正则表达式根本不是我的事,我想知道 是否有更好的方法来做到这一点? 我确定有 :)

尝试查找 (\r?\n)?(?:\r?\n){2,} 替换 \n
可选的匹配换行符回写大于 2.

demo

或使用 \R (\R)?\R{2,}

demo2

您可以使用

preg_replace('~(\R{2})\R+|(\R){2}~', '', $text)

regex demo

详情

  • (\R{2})\R+ - 在第 1 组中捕获两个换行符序列,然后是一个或多个换行符序列
  • | - 或
  • (\R){2} - 两个换行符序列将其中最后一个捕获到第 2 组。

替换为第 1 组或第 2 组的值(因为其中之一始终为空字符串)。

不同的方式。

尝试 (\R?\R)\R+ 替换 demo

特点:

  • 要写回的单个未量化捕获
  • 无交替
  • 使用完整捕获的换行符回写
  • 最有效的方法,用户样本 114 步