2016-11-16 24 views
1

我正在寻找考虑间距问题的正则表达式。我有我的代码执行以下操作: 如果类从base_class继承,那么只需将当前类名称推入数组,然后将grep用于扩展类名称,并将扩展类名称和当前类名称都推入阵列。正则表达式来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命令字符串$键(if(/$key/))如何考虑间距问题,即如果我们有class $current_class_name extends,说明有串class$current_class_name和也同样之间$current_class_nameextends之间有很多的空间。如果我们观察我的代码的第一行,我们可以看到它认为这些字符串之间存在单个空格。但我想处理任何数量的空间的情况。 (1个空间到最多10个空间)。 所以,请帮我解决这个问题。

2)同样,当我们拿这之后,这些行代码扩展了一句话:

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

如何走字,推动它,如果扩展的类名称之后很多空格后出现extends字符串。

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

感谢

回答

3

一些建议给你:

  • +比赛前一个字符/组的1次或更多的迭代

  • {<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/ 
+0

这是一个非常明确和信息丰富的答案。我可以解决我的问题,并学习正则表达式。再次感谢。 –

2

1)匹配空格,你应该使用\s(它将匹配空格或制表符),然后你可以使用一个量词来控制多少相匹配。

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

2)我觉得你的代码是正确的,但也许我我误解了这个问题。如果超过1个空间,你只想推动它吗?如果是的话下面将工作:

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

+0

感谢您的回答。它解决了我的问题。是的,如果超过1个空格,我想推它。 –

相关问题