2016-12-25 38 views
5

我需要替换字符串中的至少双新行(\ n \ n)的最后一次出现,所以应该是\ n \ n\ n \ n \ n\ n \ n \ n \ n一个等(至少2 \ n)由 “@@”。我认为它应该是preg_replace。我已经尝试了很多选项,这是在stackoverflow这里的答案,但所有这些选项有一些案件没有抓住。我尝试了regex101网站来准备正则表达式,但我并不强壮,所以我发现了一些看起来像在网站上工作的解决方案(/((\\n){2,})+(?!.*((\\n){2,})+)/i),但是当我在代码中尝试它时,我无法正常工作。更换至少双新生产线的最后一次出现( n n)的字符串PHP

另外一个是([\\n\\n])+(.[^\\n\\n])*$,但是这其中也逮住最后NN

测试字符串是:

变压器书T101HA

存储\ n此强大的四核英特尔X5处理器意味着你”通过你所有的日常任务,你都不会有任何问题,\ n无缝多任务可以让你在更短的时间内完成更多任务。存储也非常灵活。内部有128GB的超高速闪存,并且可以通过micro SD卡插槽轻松扩展。 \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ nCPU | Innn dsafdsfdfa \ n \ n \ n \ n \ n \ n您可以在华硕WebStorage上获得一年免费的无限制云存储空间! \ n \ n DFNN

所以结果应该是:

存储\ n此强大的四核英特尔X5在变压器书T101HA处理器意味着你不会有任何问题,在所有你的日常发虚任务,无缝多任务处理,让您在更短的时间内完成更多任务。存储也非常灵活。内部有128GB的超高速闪存,并且可以通过micro SD卡插槽轻松扩展。你也让你对华硕WEBSTORAGE一年的免费无限量云存储\ n \ nColor |!白色/金色\ n \ n \ n \ n \ n \ NCPU | Innn dsafdsfdfa @@ DFNN

任何人都可以帮助解决这个问题,也许还解释了回答正则表达式的逻辑。

非常感谢。

+0

请注意,您可以通过使用[贪婪](http://www.regular-expressions.info/repeat.html#greedy)来做到这一点,而不需要任何预测。搜索['/^.*\V\K\R{2,}/s'](https://www.regex101.com/r/zOmdJ5/1)并替换为'@@'。 '。*'会吃掉直到最后一个'\ V' *非垂直空间*,后面跟着两个或更多的换行符'\ R'。报告的匹配开始(从哪里开始替换)。['\ K'重置](http://www.rexegg.com/regex-php.html#K)。请参阅[此演示在eval.in](https://eval.in/704280)。 –

回答

5

您可以使用

/\n{2,}(?!.*\n{2})/s 

regex demo

详细

  • \n{2,} - 2个或更多的换行符
  • (?!.*\n{2}) - 不跟任何0+字符跟随带有2个换行符。

如果有任何换行符,请用\R替换\n

+0

非常感谢你,我做了一些改变,因为我发现我的字符串在每个** \ n **之前都带有** \ r **,所以在我的情况下最终的解决方案是/(\ r \ n){ 2,}(?!。*(\ r \ n){2})/ s' – IncreMan

+0

实际上,这就是'\ R'很方便的地方 - '/ \ R {2,}(?!。* \ R { 2})/ s','\ R'匹配任何换行符,CRLF,CR和LF。 –

相关问题