如何在Perl正则表达式中匹配换行符\n?

15

我想匹配这一行,

<center>'''<font color="blue"><font size="18.0pt">No Change Alarms Help &amp; Information</font></font>'''</center>

并将其替换为,

=<center>'''<font color="blue">No Change Alarms Help &amp; Information</font>'''</center>=

如果标签总是font color或center,那么这很简单,但它们可能是任何东西,并且可能有多个。

我的当前代码是这样的:

$html =~ s/<font size=".+">(.+)<\/font>/$1/g;

但这显然不能在每个端点上执行“=”。

我想要做的是这样的:

$html =~ s/\n(.+)<font size=".+">(.+)<\/font>(.+)\n/=$1$2$3=/g;

然而它无法匹配换行符,我无法想象如何让它匹配上,有什么线索吗?

(我正在将HTML转换为维基标记,但是转换器会弄乱字体大小,因此我正在手动将它们转换为维基风格的标题。)


4
这里适用于此问题的被接受答案同样适用。 - cdhowie
1
我想我首先要问自己的是:新行符实际上是否在源代码中,而且我是否想要将它们去掉? 我意识到这可能对你没有帮助,但很难知道你的确切情况。(例如,它是每次都无法匹配,还是每第二个案例无法匹配等?此外,$html代表整个页面还是部分内容?)另外,是的,请使用XML解析器 ;) - William
XML解析器通常是正确的工具,但在这种解析非常有限的HTML子集和数百兆字节数据的情况下,正则表达式不仅更合适,而且速度更快。 - rollsch
3个回答

14

我所需要的只是在查询结尾处添加/gm,结果发现它默认忽略换行符。


这不可能是你问题的答案。/g 会匹配所有可能的结果,而 /m 只影响 ^$ 锚点,而你并没有使用它们。/s 允许 . 匹配换行符。 - brian d foy

11
在某些情况下,由于perl的“吞入”输入方式,可能无法正常工作。将-0777 作为参数传递将使它考虑多行。(将其与其他参数一起传递,如perl -0777pi -e

0
$string_given =~ s/matching expression/sustitution/s;

我认为这会起作用,使用/s修饰符,它的助记意义是“将字符串视为单行”。这会改变“.”的行为,使其匹配换行符。
为了将此评论的开头与结尾匹配,我们像这样添加/s修饰符:
$str =~ s/<!-- Start.*End of section -->//s;

没有 /s,它根本无法匹配。


/s 允许 . 匹配换行符。它只是这样做的。 这与将整个字符串视为单个行有点不同,这更类似于已发生的事情和 /m 所关闭的,以便 ^$ 可以在换行符周围匹配(因此是多行字符串)。 - brian d foy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接