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

Php 在换行符上使用非常特定的模式进行正则表达式故障排除,php,regex,string,preg-replace,str-replace,Php,Regex,String,Preg Replace,Str Replace,我尝试在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\u replac

我尝试在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\u replace('~(\R{2})\R+~,'$1',$text)

这两种方法都可以,但这个过程似乎很有趣,因为正则表达式根本不是我的专长,我想知道是否有更好的方法可以做到这一点?我肯定有:)

尝试查找
(\r?\n)?(?:\r?\n){2,}
替换
1\n

可选的匹配线中断回写大于2

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

尝试查找
(\r?\n)?(?:\r?\n){2,}
替换
$1\n

可选的匹配线中断回写大于2

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

您可以使用

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

详细信息

  • (\R{2})\R+
    -在组1中捕获两个换行序列,然后是一个或多个换行序列
  • |
    -或
  • (\R){2}
    -两个换行序列将最后一个换行序列捕获到组2中
替换为组1或组2的值(因为其中一个始终为空字符串)。

您可以使用

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

详细信息

  • (\R{2})\R+
    -在组1中捕获两个换行序列,然后是一个或多个换行序列
  • |
    -或
  • (\R){2}
    -两个换行序列将最后一个换行序列捕获到组2中
替换为组1或组2的值(因为其中一个始终是空字符串)。

不同的方式

请尝试
(\R?\R)\R+
替换
$1

特点:

  • 要回写的单个未量化捕获
  • 不可更改
  • 使用完整捕获的换行符进行写回
  • 最有效的方法是在用户示例上执行114个步骤
    • 不同的方式

      请尝试
      (\R?\R)\R+
      替换
      $1

      特点:

      • 要回写的单个未量化捕获
      • 不可更改
      • 使用完整捕获的换行符进行写回
      • 最有效的方法是在用户示例上执行114个步骤

      我不明白,你用一个替换两个连续的“\n”吗?@MaxMuster Yes两个连续的“\n”用一个,然后如果有更多的,用另一个替换所有的“\code>preg\u替换(“~(\R{2})\R+{2}',“$1$2',$text”)@WiktorStribiżew正是这样。谢谢你想把它写下来作为答案吗?我不明白,你会用一个替换两个连续的“\n”吗?@MaxMuster Yes两个连续的“\n”用一个替换,然后如果有更多的,用另一个替换所有的“\code>preg\u替换(“~(\R{2})\R+|(\R){2},“$1$2',$text)@WiktorStribiżew正是这样。谢谢你想把它写下来作为答案吗?看起来你的两个解决方案都有效,非常感谢。评论中有一个人首先给出了答案,所以如果他决定写一个答案,我会优先考虑他,否则我会将这个标记为正确答案。顺便说一句:demo2链接到no demo:)为不同的正则表达式和philoposy添加演示链接。这样效率提高了30%,而且是在第一次评论后4分钟。对我来说无关紧要。我的帖子是3小时前写的,其他评论都是2小时前写的。不过4分钟就快多了。看来你们的两种解决方案都有效,非常感谢。评论中有一个人首先给出了答案,所以如果他决定写一个答案,我会优先考虑他,否则我会将这个标记为正确答案。顺便说一句:demo2链接到no demo:)为不同的正则表达式和philoposy添加演示链接。这样效率提高了30%,而且是在第一次评论后4分钟。对我来说无关紧要。我的帖子是3小时前写的,其他评论都是2小时前写的。不过它真的要快4分钟。