我正在尝试匹配段落模式而我遇到了麻烦。
模式是:
[image.gif]
some words, usually a few lines
name
emailaddress<mailto:theemailaddress@mail.com>
我尝试匹配gif image
和<mailto:
之间的所有内容,但这会在文件中多次出现,这意味着我的结果会很糟糕。
我用这个
尝试了(?<=\[image.gif\].*?(\[image.gif\])).*?(?=<mailto:)
有没有办法使用Regex来匹配段落的总体布局?
答案 0 :(得分:1)
“段落的总体布局”需要更好的定义。鉴于缺乏输入和预期输出,我不得不猜测你想要什么。我也猜测你会接受任何语言。这是perl
,几乎肯定不是您熟悉的语言。
假设输入:
do not match this line
[image.gif]
some words, usually a few lines
Bobert McBobson
emailaddress<mailto:bobertmb@example.com>
don't match this line either
[image.gif]
another few words
on another few lines
Bobina Robertsdaughter
emailaddress<mailto:bobinard@example.info>
this line is also not for matching
预期产出:
[image.gif]
some words, usually a few lines
Bobert McBobson
emailaddress<mailto:bobertmb@example.com>
---
[image.gif]
another few words
on another few lines
Bobina Robertsdaughter
emailaddress<mailto:bobinard@example.info>
使用perl
的解决方案:
#!/usr/bin/perl -n007
my $sep = "";
while (/(\[image\.gif\].*?<mailto:[^>]*>(\r)?\n)/gms) {
print $sep . $1;
$sep = "---$2\n";
}
perl
是正则表达式语言之王;很多人会说这一切都很有用。在这里,我们使用-n007
选项告诉它读取每个文件的全部内容并在其上运行代码作为默认变量。
$sep
开始为空,因为在第二场比赛之前没有什么可以分开。
然后我们遍历与正则表达式匹配的每个文本块:
[image.gif]
<mailto:
并一直持续到下一个>
然后我们打印匹配,最后将分隔符设置为三个破折号和一个换行符(需要时添加DOS行结尾)。
现在你可以运行它了:
$ perl answer.pl input.txt
[image.gif]
some words, usually a few lines
Bobert McBobson
emailaddress<mailto:bobertmb@example.com>
---
[image.gif]
another few words
on another few lines
Bobina Robertsdaughter
emailaddress<mailto:bobinard@example.info>