使用变量在模式匹配期间忽略空格

时间:2014-05-28 09:41:13

标签: regex perl

考虑以下两个文件。

File1中:

 Name : John Paul 
Address: 243,  First Floor,
          XYZ - 12345. 
Phone : 555  444 3333 
Name : Mison 
Address: some address like above 
Phone: 444 333 2222

文件2:

Name: John Paul
Address: 243, First Floor,
         XYZ - 12345.
Phone: 555 444 3333

我正在使用Perl。假设我从File2读取第一个Name-to-Phone块并将其存储在$var_file2中(通过逐行读取连接)。 File1的内容存储在$var_file1(slurped)中。考虑我需要将File2中的整个Name-to-Phone块与File1中的块进行比较,并将匹配替换为另一个字符串。我在quotemeta上使用了$var_file2函数,因为模式匹配并没有这样做。

$q_var_file2 = quotemeta($var_file2);
$replace = "replace_text";
$var_file1 =~ s/$q_var_file2/$replace/s;

现在,当模式完全匹配时,上面的代码可以正常工作。但是在执行模式匹配和替换时需要忽略的单词/字符之间的文件1或文件2中可能是附加的或没有空格

我尝试使用仅匹配非空白区域的\S。但我想我错过了什么。我甚至尝试使用变量而不对它们应用quotemeta

1 个答案:

答案 0 :(得分:1)

嗯,你只想用$var_file2替换\s+中所有连续的空格序列,同时确保所有其他字符都通过quotemeta

$q_re_file = join q{\s+}, map {quotemeta} split /\s+/, $var_file2;

$q_re_file = join q{\s+}, map quotemeta, $var_file2 =~ /\S+/g;

$q_re_file = $var_file2;
$q_re_file =~ s/(\S+)/quotemeta $1/ge;
$q_re_file =~ s/\s+/\\s+/g;

等。等

并使用$q_re_file作为正则表达式。