regex在考虑单词前面出现的空格时对特定单词进行grep

regex在考虑单词前面出现的空格时对特定单词进行grep,regex,perl,Regex,Perl,我正在寻找考虑到间距问题的正则表达式。我有代码来执行以下操作: 如果类是从base_类扩展而来的,那么只需将当前类名推送到数组中,否则将grep作为扩展类名,同时将扩展类名和当前类名推送到数组中 my $key = "class " . $current_class_name . " extends"; my $variable1 = "extends base_class"; if(/$key/){ if(/($variable1)/){

我正在寻找考虑到间距问题的正则表达式。我有代码来执行以下操作: 如果类是从base_类扩展而来的,那么只需将当前类名推送到数组中,否则将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                                                           
            }

        }
我有两个问题。 1)当字符串$ $的GRIP(<代码>如果(/$密钥/)< /代码>)如何考虑间隔问题,即如果我们有<代码>类$ CurrutyCub类名称扩展表示字符串
class
$current\u class\u name
之间有许多空格,同样地,
$current\u class\u name
扩展之间也有许多空格。如果我们观察代码的第一行,我们可以看到它认为这些字符串之间只有一个空格。但我想处理任意数量空间的情况。(最多1个空间到10个空间)。
所以,请帮我处理这个问题

2) 类似地,当我们在这些代码行中使用extends后面的单词时:

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

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

谢谢

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

下面的示例允许$key匹配类名周围的任意数量的空格(但必须至少有一个空格):
my$key=“class\s+”$当前\u类\u名称。“\s+扩展”

2) 我认为你的代码是正确的,但也许我误解了这个问题。是否仅当空间超过1个时才要推动它?如果是这样的话,下面的方法就行了:

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

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

下面的示例允许$key匹配类名周围的任意数量的空格(但必须至少有一个空格):
my$key=“class\s+”$当前\u类\u名称。“\s+扩展”

2) 我认为你的代码是正确的,但也许我误解了这个问题。是否仅当空间超过1个时才要推动它?如果是这样的话,下面的方法就行了:

/.extends\s\s+([A-Za-z_0-9]+)/;

推送@test_list,$1

给您一些建议:

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

  • {}
    匹配上一个字符/组的迭代次数。因此,
    {10}
    正好匹配10次迭代

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

  • \s
    匹配空格,因此制表符和空格

  • 我建议尝试字符串插值,因为它是我最喜欢的Perl语言之一。i、 e.
    “class$current\u class\u name扩展”
    ,而不是
    “class”$当前\u类\u名称。“扩展”
    。字符串插值适用于双引号,但不适用于单引号

  • 这属于样式,但如果只在一个地方使用,我通常不会创建变量

  • 在使用
    $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/

如果你想保持1-10的空间限制
\s
也与选项卡匹配,因此如果您确实只想接受空格,可以将其更改为

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

给你一些建议:

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

  • {}
    匹配上一个字符/组的迭代次数。因此,
    {10}
    正好匹配10次迭代

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

  • \s
    匹配空格,因此制表符和空格

  • 我建议尝试字符串插值,因为它是我最喜欢的Perl语言之一。i、 e.
    “class$current\u class\u name扩展”
    ,而不是
    “class”$当前\u类\u名称。“扩展”
    。字符串插值适用于双引号,但不适用于单引号

  • 这属于样式,但如果只在一个地方使用,我通常不会创建变量

  • 在使用
    $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/

如果你想保持1-10的空间限制
\s
也与选项卡匹配,因此如果您确实只想接受空格,可以将其更改为

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

这是一个非常清楚和信息丰富的答案。我可以解决我的问题,也可以学习正则表达式。再次感谢。这是一个非常清楚和翔实的答案。我可以解决我的问题,也可以学习正则表达式。再次感谢,谢谢你的回答。它解决了我的问题。是的,如果有超过1个空格,我想按一下。谢谢你的回答。它解决了我的问题。是的,如果有超过1个空间,我想推它。