Regex 需要一种多毛的多行正则表达式

Regex 需要一种多毛的多行正则表达式,regex,macos,multiline,Regex,Macos,Multiline,我正在尝试清理一个csv文件,该文件包含许多格式错误的电子邮件地址,例如以下示例: "Scarpaci" "Joseph" <scarp@vt.edu>" "Adams" "Robert" <robadams@localnet.com>" “斯卡帕西” “约瑟夫” “亚当斯” “罗伯特” 它显示了两个地址,但名字和姓氏在不同的行中。我需要一个正则表达式,它将1)识别多行地址,2)将其替换为名字、姓氏和电子邮件地址所有一行,但用双引号括起来的名字和姓氏 我使用的是Mac

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

"Scarpaci"
"Joseph" <scarp@vt.edu>"
"Adams"
"Robert" <robadams@localnet.com>"
“斯卡帕西”
“约瑟夫”
“亚当斯”
“罗伯特”
它显示了两个地址,但名字和姓氏在不同的行中。我需要一个正则表达式,它将1)识别多行地址,2)将其替换为名字、姓氏和电子邮件地址所有一行,但用双引号括起来的名字和姓氏


我使用的是Mac OS,无论哪个正则表达式引擎有…

Perl都可以做到这一点。将记录分隔符设置为与记录结尾匹配的值,而不是默认值(换行):

然后你就可以像平常一样“一行一行”地读,然后把它清理干净。类似的内容应该在循环中有所帮助,使用Perl的修饰符,这样换行就可以了,使用x作为注释来记录它:

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

$ perl that-script.pl < that-data.txt 
"Scarpaci Joseph" scarp@vt.edu
"Adams Robert" robadams@localnet.com
$ 
$perl that-script.pl
到目前为止,您的尝试看起来像什么?(这不是免费的“按需编码”服务。)分两步完成。将
(?)“\r?\n”
替换为空格,然后将
(?)“(?=\r?\n”)
替换为空。对不起,我不知道从何处开始在多行上使用regex…但下面的答案,使用一点perl,提供了一个优雅的解决方案。
#!/usr/bin/perl -l

local $/ = '>"';

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

    print qq["$1 $2" $3];
}
$ perl that-script.pl < that-data.txt 
"Scarpaci Joseph" scarp@vt.edu
"Adams Robert" robadams@localnet.com
$