【问题标题】:Perl Regex case insensitivePerl 正则表达式不区分大小写
【发布时间】:2018-04-17 15:03:15
【问题描述】:

我确定我错过了一些简单的东西。下面的代码我试图用正则表达式不区分大小写(//i)匹配文件的两行。如果文件行在不同情况下不同,它仍然匹配。

在没有模式匹配、遍历文件和逐行比较的情况下,它可以正常工作。只是试图添加不区分大小写。

#add file lines to array for comparison
while (my $fileLine = <FILE1>)
{
   chomp($fileLine);
   push @lines, $fileLine;
   $compare{$fileLine}++;
}
#comparison of second file to first file
while (my $fileLine2 = <FILE2>)
{

   chomp($fileLine2);
   $lineNum = 1 + $count;
   my $comp = $fileLine2;

   if ($comp =~ s/$lines[$count]//i)
   {
     print "The different line is at Line Number: $lineNum \n" unless(exists($compare{$fileLine2}));
     print "File A: $fileLine2\n" unless (exists($compare{$fileLine2}));
     print "File B: $lines[$count]\n" unless (exists($compare{$fileLine2}));
   }

}

【问题讨论】:

  • 请不要编辑您的代码以删除您询问的错误。

标签: regex perl


【解决方案1】:

您的代码不匹配,它替换:

$comp =~ s/$lines[$count]//i

$lines[$count] 被解释为正则表达式,但您将字符串存储到数组中。并非每个字符串都匹配从它创建的正则表达式,例如

my $string = 'a+b';
$string =~ s/$string//;  # $string is unchanged

a+b 作为正则表达式意味着至少有一个a 后跟b,这显然不适用于字符串。见quotemeta

您没有显示您遇到问题的行,但您可以看到即使不区分大小写它也不起作用。

要比较 $s1 和 $s2 是否相同,您可以使用

lc $s1 eq lc $s2

有关 unicode 大小写折叠,请参阅 lcucfc

你还需要将统一的字符串存储在哈希中!

【讨论】:

  • 已修改,抱歉意味着没有任何正则表达式即可工作,而且我没有 s/。我只是在尝试一堆不同的东西。感谢您的回复
猜你喜欢
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 1970-01-01
相关资源
最近更新 更多