我正在使用regexp来移动文本块,但它只删除单行 - 我应该包含哪些内容才能删除多行?
答案 0 :(得分:3)
您可能正在寻找/<!--\[perl\](.*?)-->/s
使用选项开关/s
它将字符串视为一行。
“”。 (点)将匹配任何字符,包括换行符。
答案 1 :(得分:2)
在尝试使正则表达式跨多行工作时,通常会有两件事情让人兴奋。
首先是正则表达式中的点与换行符不匹配,除非您使用/s
或m//
运算符上的s///
选项。
第二个是,如果你一次处理一个文本文件(可能是while (<$filehandle>) { ... }
),那么每次循环你只需要一行文本来匹配。您需要立即读取整个文件(可能使用$text = do { local $/; <$filehandle>};
)。
答案 2 :(得分:1)
#!/usr/bin/env perl
use strict; use warnings;
{
local $/ = '-->';
while (my $chunk = <DATA>) {
$chunk =~ s/<!-- \[perl\] (.*) --> \z//sx;
print $chunk;
}
}
__DATA__
<!--[perl]
my $x = 5;
my $y = 3;
say $x + $y
-->
<!--[not]
const char *s = "This is not Perl ;-)";
-->
通过明智地改变input record separator,您可以确保您阅读的每个块都以字符串"-->"
结束。然后,通过向您的替换运算符提供.
标志,确保/s
可以匹配行结尾。
输出:
<!--[not] const char *s = "This is not Perl ;-)"; -->
如果重要,您还可以从块中删除前导/尾随空格。