Perl正则表达式哈希匹配字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Perl正则表达式哈希匹配字符串相关的知识,希望对你有一定的参考价值。

现在我有以下代码......

%strings = ( 'a' => 'x',
             'b0' => 'y',
             'b1' => 'y',
             'b2' => 'y',
                 ...
             'bN' => 'y'
             'c' => 'z');
               ....


if(grep { $_ eq $line[0] } keys %strings){
   ....
}

所以我设置了这个哈希。 $ line是通过读取文件创建的。然后我查看该行中的第一个字符串是否包含在我的哈希中。这段代码完美无缺。但是,我的问题出现在哈希中,b正在增长。例如,现在我必须明确列出b0 - b63。这是64个不同的定义,只需要具有相同的值。有没有办法像b/d那样使用散列键的正则表达式?

答案

如果你想使用正则表达式,没有什么能阻止你这样做:

%strings = (
  'a'    => 'x',
  'bd+' => 'y',
  'c'    => 'z'
);
...

if( grep { $line[0] =~ /^$_$/ } keys %strings ) {
  ...
}

^$是必要的,以确保完整的字符串$line[0]匹配,而不仅仅是它的一部分。

请记住,这将比eq比较慢得多。另一方面,grep评估的表达式数量会低得多,因此如果执行速度有问题,您可能需要分析不同的选项。

另外,请记住,您可能希望优化正则表达式。例如,^bd{1,2}$将匹配b,后跟一位或两位数。甚至^b[1-6]?d$ ......

另一答案

如果我理解正确,

bd+

这将匹配“b”后跟任何只有数字的字符串。

另一答案
my %strings = ('a' => 'x',
         map{("b$_" , 'y') } 0..63,
         'c' => 'z');

应该做的伎俩;)

如果它是你想要的

如果您需要在代码中稍后添加'b值',您仍然可以执行$strings{"b$value"} = 'y';在哈希中添加新值

以上是关于Perl正则表达式哈希匹配字符串的主要内容,如果未能解决你的问题,请参考以下文章

Perl 正则表达式匹配大型 Unicode 代码点

perl 正则表达式 模糊匹配

Perl 正则表达式匹配分隔字符串

perl 之 正则表达式 (简)

Perl:转义字符串中的特殊字符以匹配正则表达式

perl学习模式匹配与正则表达式