【问题标题】:How to find strings that contain a substring from a given list如何从给定列表中查找包含子字符串的字符串
【发布时间】:2015-09-02 20:50:03
【问题描述】:

我有一个字符串,它可能包含也可能不包含某些特定的单词。 如果它包含我想以不同颜色打印字符串的作品之一(取决于单词) 所以我想有一个包含单词列表的数组(例如,一个用于红色单词,一个用于黄色,一个用于绿色,如下例所示:

push(@red_word, [ "error","ERROR","Assertion","assertion","Error","ASSERTION","Errors" ]);
push(@yellow_word, [ "WARNING","Warning","warning","PAUSED","Paused","paused","Warnings" ]);
push(@green_word, [ "ACTIVE","Active","active" ]);

$l 是我要检查的字符串,我试过这样的

foreach my $l (@$lines) {
    if ($l =~ @red_word) {
            print '<FONT COLOR="FF0000">'.$l.'</FONT><br>';
    }
    else {
        if ($l =~ @yellow_word) {
            print '<FONT COLOR="FFFF00">'.$l.'</FONT><br>';
        }
        else {      
            if ($l =~ @green_word) {
                print '<FONT COLOR="008000">'.$l.'</FONT><br>';
            }
            else {
                print '<FONT COLOR="000000">'.$l.'</FONT><br>';
            }
        }
    }
}

但结果不稳定,有些行以红色打印,与列表 red_word 没有任何关系。

我做错了什么?

【问题讨论】:

    标签: perl


    【解决方案1】:

    这不是你认为的那样:

    push(@red_word, [ "error","ERROR","Assertion","assertion","Error","ASSERTION","Errors" ]);
    push(@yellow_word, [ "WARNING","Warning","warning","PAUSED","Paused","paused","Warnings" ]);
    push(@green_word, [ "ACTIVE","Active","active" ]);
    

    您正在创建一个二维数据结构,它是一个单元素数组,包含一个嵌套数组。

    $VAR1 = [
              [
                'error',
                'ERROR',
                'Assertion',
                'assertion',
                'Error',
                'ASSERTION',
                'Errors'
              ]
            ];
    

    结果,这场比赛不会很好地发挥作用。我实际上不确定它会做什么,但它不会测试“如果这个词在列表中”。

    尝试从您的数组构建正则表达式:

    my @red_words = (
        "error", "ERROR",     "Assertion", "assertion",
        "Error", "ASSERTION", "Errors"
    );
    my $is_red = join( "|", map {quotemeta} @red_words );
    $is_red = qr/($is_red)/;
    
    print "Red" if $line =~ m/$is_red/;
    

    大概是这样的:

    #!/usr/bin/env perl
    
    use strict;
    use warnings;
    
    my %colour_map = (
        'error'     => 'FF0000',
        'errors'    => 'FF0000',
        'assertion' => 'FF0000',
        'warning'   => 'FFFF00',
        'warnings'  => 'FFFF00',
        'paused'    => 'FFFF00',
        'active'    => '008000',
    );
    
    my $search = join( "|", map {quotemeta} keys %colour_map );
    $search = qr/\b($search)\b/;
    
    my @lines = (
        "line containing assertion",
        "a warning",
        "green for active",
        "A line containing ACTIVE"
    );
    
    
    foreach my $line (@lines) {
        if ( my ($word) = $line =~ m/$search/ ) {
            print "<FONT COLOR=\"$colour_map{lc($word)}\">$line</FONT><BR/>\n";
        }
        else {
            print "<FONT COLOUR=\"000000\">$line</FONT><BR/>\n";
        }
    }
    

    (不完全确定是否有办法转置匹配列表。我会有另一个想法)。

    【讨论】:

      猜你喜欢
      • 2016-04-13
      • 2015-01-31
      • 2023-01-19
      • 1970-01-01
      • 2015-12-27
      • 2011-01-28
      • 1970-01-01
      • 2019-09-21
      相关资源
      最近更新 更多