需要一种毛茸茸的多线正则表达式

时间:2017-12-21 16:46:15

标签: regex macos multiline

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

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

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

使用Mac OS,无论有什么正则表达式引擎......

1 个答案:

答案 0 :(得分:1)

Perl对此很有好处。将记录分隔符设置为与记录结尾匹配的内容,而不是默认值(即换行符):

local $/ = '>"';

然后你可以像往常一样“逐行”地阅读它并以这种方式清理它。这样的东西应该有助于循环,使用Perl的修饰符,所以换行是正常的,x用于注释来记录它:

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

您的输出类似于"$1 $2" $3,包含捕获的组。

这适用于MacOS。

#!/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
$