正则表达式匹配段落模式

时间:2016-06-30 20:58:05

标签: regex

我正在尝试匹配段落模式而我遇到了麻烦。

模式是:

[image.gif]
some words, usually a few lines

name

emailaddress<mailto:theemailaddress@mail.com>

我尝试匹配gif image<mailto:之间的所有内容,但这会在文件中多次出现,这意味着我的结果会很糟糕。

我用这个

尝试了
(?<=\[image.gif\].*?(\[image.gif\])).*?(?=<mailto:)

有没有办法使用Regex来匹配段落的总体布局?

1 个答案:

答案 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开始为空,因为在第二场比赛之前没有什么可以分开。

然后我们遍历与正则表达式匹配的每个文本块:

然后我们打印匹配,最后将分隔符设置为三个破折号和一个换行符(需要时添加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>