正则表达式在考虑单词

时间:2016-11-16 16:05:15

标签: regex perl

我正在寻找考虑间距问题的正则表达式。我有我的代码来执行以下操作: 如果类从base_class扩展,那么只需将当前类名称推送到数组中,否则将grep用于扩展类名称,并将扩展类名称和当前类名称都推送到数组中。

my $key = "class " . $current_class_name . " extends";
my $variable1 = "extends base_class";
       if(/$key/){
            if(/($variable1)/){                                                             # Checking if it extends from "base_class"
                push @test_list, $current_class_name ;                                             # Pushing the test name if it extends from "base_class"
            }
            else {                                                                          # If it doesn't extend from "base_class"
                /.extends[\s]+([A-Za-z_0-9]+)/ ;
                push @test_list, $1;                                                    # Pushing the extended test name into array
                push @test_list, $current_class_name;                                              # Pushing the current test name into array                                                           
            }

        }

我有2个问题。 1)当grep为字符串$ key(if(/$key/))时如何考虑间距问题,即如果我们有class $current_class_name extends,则表明字符串class和{{1}之间有很多空格在$current_class_name$current_class_name之间也是类似的。如果我们观察代码的第一行,我们可以看到它认为这些字符串之间只有一个空格。但我想处理任何数量的空间的情况。 (最多1个空间到10个空格)。 所以,请帮我处理这个问题。

2)同样,当我们在这些代码行中取出后面的单词时:

extends

如果扩展的类名在/.extends[\s]+([A-Za-z_0-9]+)/ ; push @test_list, $1; 字符串之后的许多空格之后出现,我该如何理解并推送它。

我希望我的解释清楚。如果我的问题的任何部分不清楚,请评论。我会相应地编辑它。

由于

2 个答案:

答案 0 :(得分:3)

为您提供的一些建议:

  • +匹配前一个字符/组的一次或多次迭代

  • {<number>}匹配前一个字符/组的迭代次数。所以{10}恰好匹配10次迭代。

  • {<number1>,<number2>}匹配前一个字符/组的number1number2次迭代。因此{1,10}匹配1到10次迭代,{2,}匹配2次或更多次迭代,{,10}匹配0到10次迭代。

  • \s匹配空格,因此标签和空格

  • 我建议尝试字符串插值,因为它是我最喜欢的Perl之一。即"class $current_class_name extends"而不是"class " . $current_class_name . " extends"。字符串插值适用于双引号,但不适用于单引号。

  • 这属于风格,但如果仅在一个地方使用,我通常不会创建变量。

  • 在使用$1之前,请始终测试您的正则表达式是否匹配,否则它将是之前成功的正则表达式匹配的结果。

示例:

if (/class\s+$current_class_name\s+extends/) {
    if (/(extends base_class)/) {
        push @test_list, $current_class_name;
    }
    elsif (/extends\s+([A-Za-z_0-9]+)/) {
        push @test_list, $1;
        push @test_list, $current_class_name;
    }
    else {
        # not sure what you want to do in this case, looks like it
        # would be a syntax error assuming this is Java
    }
}

您可以更改

/class\s+$current_class_name\s+extends/

/class\s{1,10}$current_class_name\s{1,10}extends/

如果你想保持1-10空间限制。 \s也匹配制表符,因此如果您真的只想接受空格,可以将其更改为

/class[ ]{1,10}$current_class_name[ ]{1,10}extends/

答案 1 :(得分:2)

1)要匹配空格,您应该使用\s(它将匹配空格或制表符),然后您可以使用量词来控制要匹配的数量。

以下示例允许$ key匹配类名周围的任意数量的空格(但必须至少有一个空格):
my $key = "class\s+" . $current_class_name . "\s+extends";

2)我认为你的代码是正确的,但也许我误解了这个问题。如果空间超过1个,你只想推它吗?如果是这样,以下方法将起作用:

/.extends\s\s+([A-Za-z_0-9]+)/ ; push @test_list, $1;