需要那种毛茸茸的多行正则表达式

Kind of hairy multiline regex needed

我正在尝试清理包含许多格式错误的电子邮件地址的 csv 文件,例如这个示例:

"Scarpaci"
"Joseph" <scarp@vt.edu>"
"Adams"
"Robert" <robadams@localnet.com>"

其中显示了两个地址,但名字和姓氏在不同的行中。我需要一个正则表达式,它将 1) 识别多行地址,以及 2) 用名字、姓氏和电子邮件地址替换所有一行,但用双引号括起名字和姓氏。

我正在使用 Mac OS,任何具有...

的正则表达式引擎

Perl 很适合这个。将记录分隔符设置为与记录结尾匹配的内容,而不是默认值(换行符):

local $/ = '>"';

然后您可以像往常一样在 "line by line" 中阅读它并以这种方式清理它。像这样的东西应该有助于循环,使用 Perl 的 s 修饰符所以换行符是好的,x 用于注释以记录它:

 /\"([^\"]+)\".+? # first name
  \"([^\"]+)\"\s+ # second name
  <(.+)>\"* # email
 /xs or next;

您的输出类似于 " " ,包含捕获的组。

这在 MacOS 上运行良好。

#!/usr/bin/perl -l

local $/ = '>"';

while (<>) {
    /\"([^\"]+)\".+? # first name
     \"([^\"]+)\"\s+ # second name
     <(.+)>\"* # email
    /xs or next;

    print qq[" " ];
}

非毛输出:

$ perl that-script.pl < that-data.txt 
"Scarpaci Joseph" scarp@vt.edu
"Adams Robert" robadams@localnet.com
$