将字符串与数组进行比较以查找匹配项

时间:2017-06-01 03:58:18

标签: regex perl

我可以将单个字符串与完整数组进行比较。在下面的情况下,我无法满足条件可能是由于区分大小写的不正确的正则表达式,我想匹配任何单词。

例如。移动1-2步应匹配1-2步,移动8-10步应匹配8-10步等。

my @db_description=("MOVE 1-2 STEPS TO GB FIXTURE","WITHIN REACH TO CHECK","GET BEAM","PUSH/PULL ( >= 30 CM)","BEAM 2-3 TIMES","MOVE 8-10 STEPS TO HOIST");
my @steps_name = ("1-2 Steps", "5-7 Steps", "8-10 Steps", "11-15 Steps");

    for(my $i=0;$i<@db_description;$i++)
    {
                if (grep { /(?i)\Q$db_description[$i]\E/ } @steps_name) 
                    {
                         print "<br><h1>Element '$db_description' found !</h1></br>" ;
                    }

                    else
                    {
                         print "<br>$db_description not found </br>"
                    }
    }

2 个答案:

答案 0 :(得分:0)

你写了一些可怕的Perl,我不确定你的意思。你能更好地解释一下吗?

看起来你想解析一个定制的语言,所以简单的字符串拼写不起作用

这个作业是基于你指定的机器吗?或者你这样做是为了谋生吗?如果是后者,那么你隐瞒了我们的信息,所以我们无法帮助你。

显而易见的问题是你的C风格的for循环作为范围会更好,但你永远不会在循环块中使用$i

这是我手动整理的代码版本。我希望能帮助别人帮助你

my @db_description = (
    "MOVE 1-2 STEPS TO GB FIXTURE",
    "WITHIN REACH TO CHECK",
    "GET BEAM",
    "PUSH/PULL ( >= 30 CM)",
    "BEAM 2-3 TIMES",
    "MOVE 8-10 STEPS TO HOIST",
);

my @steps_name = (
    "1-2 Steps",
    "5-7 Steps",
    "8-10 Steps",
    "11-15 Steps",
);

for ( my $i = 0; $i < @db_description; $i++ ) {

    if ( grep { /(?i)\Q$db_description[$i]\E/ } @steps_name ) {
        print "<br><h1>Element '$db_description' found !</h1></br>";
    }
    else {
        print "<br>$db_description not found </br>";
    }
}

旁白:除非您特别需要,否则请永远不要使用(?i)。例如,构建一个将用作其他模式的一部分的正则表达式模式,而限制仅适用于子模式。

答案 1 :(得分:-1)

他的问题有效..请尝试以下代码

my @db_description=("MOVE 1-2 STEPS TO GB FIXTURE","WITHIN REACH TO CHECK","GET BEAM","PUSH/PULL ( >= 30 CM)","BEAM 2-3 TIMES","MOVE 8-10 STEPS TO HOIST");
my @steps_name = ("1-2 Steps", "5-7 Steps", "8-10 Steps", "11-15 Steps");
my $testString1;
my $testString2;

my @abc;
my @xyz;

for(my $i=0;$i<$#db_description;$i++)
    {
    @abc = split (/ /,$db_description[$i]);
    for(my $j=0;$j<$#steps_name;$j++)
     {
         @xyz = split (/ /, $steps_name[$j]);
         for (my $i1=0; $i1<$#abc; $i1++)
            {
            for (my $j1=0; $j1<$#xyz; $j1++)
            {
                if ($abc[$i1] eq $xyz[$j1])
                {
                 print "$db_description[$i]  :: found $abc[$i1] == $xyz[$j1]\n";
                 }
             }

         }
     }
    }