我正在使用正则表达式来移动文本块,但它只删除单行 - 为了删除多行,我应该包括什么?
问问题
89 次
3 回答
3
您可能正在寻找/<!--\[perl\](.*?)-->/s
使用选项开关/s
它将字符串视为单行。
“。” (dot) 将匹配任何字符,包括换行符。
于 2012-06-22T20:28:31.223 回答
2
当试图使正则表达式跨多行工作时,有两件事经常使人们绊倒。
首先是正则表达式中的点与换行符不匹配,除非您使用or运算符/s
上的选项。m//
s///
第二个是,如果您一次处理一行文本文件(可能使用while (<$filehandle>) { ... }
),那么每次循环您只有一行文本要匹配。您需要一次读取整个文件(可能使用$text = do { local $/; <$filehandle>};
)。
于 2012-06-22T20:59:17.240 回答
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 ;-)";
-->
通过明智地更改输入记录分隔符,您可以确保您读取的每个块都以字符串结尾"-->"
。然后,通过向替换运算符提供标志来确保.
可以匹配行尾。/s
输出:
<!--[不是] const char *s = "这不是 Perl ;-)"; -->
如果这很重要,您还可以从块中删除前导/尾随空格。
于 2012-06-23T12:40:37.660 回答