我可以使用 preg_replace 在多行模式下去除尾随 \n 吗?

Posted

技术标签:

【中文标题】我可以使用 preg_replace 在多行模式下去除尾随 \\n 吗?【英文标题】:Can I use preg_replace to strip the trailing \n in multiline mode?我可以使用 preg_replace 在多行模式下去除尾随 \n 吗? 【发布时间】:2011-03-21 13:22:49 【问题描述】:

I just answered a question here,这让我提出了自己的问题。

基本上,OP 希望删除包含字符串的任何行。这是我想出的一个正则表达式...

$str = preg_replace('/^.*\b["(]?hello["(]?\b.*$/m', '', $str);

效果很好,但是因为 $ 在尾随 \n 之前匹配,所以它们在替换时仍然存在并且有空行,例如

string(90) "
What it shouldhello do is:


could be words in between brackets and inverted commas also."

我不能使用\z,因为我处于多行模式(至少我是这么认为的)。

如果我使用 s 修饰符,. 会变得过于贪婪,无法跨越换行符。

我已经尝试了一些东西(例如[^\n][\s\S]),现在我被难住了。

如何在此处匹配尾随 \n 以便通过替换将其删除?

【问题讨论】:

【参考方案1】:

使用 \n 代替 $。

$str = preg_replace('/^.*\b["(]?hello["(]?\b.*\n/m', '', $str);

如果里面有 hello,这会错过最后一行,所以这里更进一步。

$str = preg_replace('/^.*\b["(]?hello["(]?\b.*(\n|$)/m', '', $str);

现在的问题是最后一行被删除了,但仍然有一个 \n 字符(您已经遇到了类似的问题)。

注意:我根本不是正则表达式专家,通常可以满足我的需要。

【讨论】:

除非这会错过最后一行,如果它有你好:S【参考方案2】:

没有搞清楚这个我觉得很傻,但我用Jacob's answer作为基础......

$str = preg_replace('/^.*\b["(]?hello["(]?\b.*\n?/m', '', $str);

看来我只是太热心无法使用行尾锚点。

这个允许在最后使用可选的\n。它还在最后一个不匹配行的末尾留下一个\n,但我总是可以然后trim($str)

【讨论】:

和我有同样的问题,因为我的编辑......最后一行:S【参考方案3】:

请试试这个:

$str = preg_replace('/^.*?\b["(]?hello["(]?\b.*?$/s', '', $str);

.*? 使它不贪婪。

【讨论】:

抱歉,这不起作用,它只是用空字符串替换了整个字符串。

以上是关于我可以使用 preg_replace 在多行模式下去除尾随 \n 吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 bash 脚本中使用 sed 替换多行模式

preg_replace 一次替换多个模式

在交互模式下在python中执行多行语句

附加模式下的 Spark 结构化流,每个时间窗口输出多行

我无法在 Coffeescript 交互模式(REPL)中编写多行代码

BBCode 需要 preg_replace 帮助