我正在寻找考虑间距问题的正则表达式。我有我的代码来执行以下操作: 如果类从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;
字符串之后的许多空格之后出现,我该如何理解并推送它。
我希望我的解释清楚。如果我的问题的任何部分不清楚,请评论。我会相应地编辑它。
由于
答案 0 :(得分:3)
为您提供的一些建议:
+
匹配前一个字符/组的一次或多次迭代
{<number>}
匹配前一个字符/组的迭代次数。所以{10}
恰好匹配10次迭代。
{<number1>,<number2>}
匹配前一个字符/组的number1
和number2
次迭代。因此{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;