Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何使正则表达式与第一个模式而不是最后一个模式匹配?_Regex_Perl - Fatal编程技术网

Regex 如何使正则表达式与第一个模式而不是最后一个模式匹配?

Regex 如何使正则表达式与第一个模式而不是最后一个模式匹配?,regex,perl,Regex,Perl,我可能做错了。我有一个充满数据的文本文件,我想匹配并替换文件中的项目和目录号的模式。但是文件中每个元素的顺序非常重要,因此我希望从文件的顶部开始匹配/替换,然后向下进行匹配/替换 下面的代码片段实际上可以工作,但当我执行它时,它会替换SeaMonkey&SMKY-1978模式的第三个实例,然后替换该模式的第二个实例。我希望它做的是替换模式的第一个实例,然后替换第二个实例 所以我希望输出结果是找到Kurt的SMKY-1978 SeaMonkeys,然后找到Shane的SMKY-1978 SeaMo

我可能做错了。我有一个充满数据的文本文件,我想匹配并替换文件中的项目和目录号的模式。但是文件中每个元素的顺序非常重要,因此我希望从文件的顶部开始匹配/替换,然后向下进行匹配/替换

下面的代码片段实际上可以工作,但当我执行它时,它会替换SeaMonkey&SMKY-1978模式的第三个实例,然后替换该模式的第二个实例。我希望它做的是替换模式的第一个实例,然后替换第二个实例

所以我希望输出结果是找到Kurt的SMKY-1978 SeaMonkeys,然后找到Shane的SMKY-1978 SeaMonkeys,然后别管Mick的SMKY-1978 SeaMonkeys,因为我只想找到并替换模式的前两个实例。现在它说找到了Shane的SMKY-1978 SeaMonkeys和Mick的SMKY-1978 SeaMonkeys,因为每次执行for循环时它都匹配最后一个模式

那么,我是错过了一个鲜为人知的微妙的正则表达式角色,还是我只是在做我想做的事情,完全错了

以下是工作代码:

# my regexp matches from the bottom to the top but I'd like it to replace from the top down
local $/=undef;
my $DataToParse = <DATA>;
my $item = "SeaMonkeys";
my $catNum = "SMKY-1978";
my $maxInstancesToReplace = 2;
parseData();
exit();

sub parseData {
    for (my $counter = 0; $counter < $maxInstancesToReplace; $counter++) {
        # Stick in a temporary text placeholder that I will replace later after more processing
        $DataToParse =~ s/(.+)\sELEMENT\s(.+?)\s\(Item := \"$item\".+?CatalogNumber := \"$catNum.+?END_ELEMENT(.+)/$1 ***** Found $2\'s $catNum $item. (counter: $counter) *****$3/s;
    } 
    print("Here's the result:\n$DataToParse\n");
}

__DATA__
    ELEMENT Kurt (Item := "BrightLite",
                  ItemID := 29,
                  CatalogNumber := "BTLT-9274",
                  Vendor := 100,
    END_ELEMENT

    ELEMENT Mick (Item := "PetRock",
                  ItemID := 36,
                  CatalogNumber := "PTRK-3475/A",
                  Vendor := 82,
    END_ELEMENT

    ELEMENT Kurt (Item := "SeaMonkeys",
                  ItemID := 12,
                  CatalogNumber := "SMKY-1978/E",
                  Vendor := 77,
    END_ELEMENT

    ELEMENT Joe (Item := "Pong",
                 ItemID := 24,
                 CatalogNumber := "PONG-1482",
                 Vendor := 5,
    END_ELEMENT

    ELEMENT Shane (Item := "SeaMonkeys",
                   ItemID := 1032,
                   CatalogNumber := "SMKY-1978/E",
                   Vendor := 77,
    END_ELEMENT

    ELEMENT Kurt (Item := "Battleship",
                  ItemID := 99,
                  CatalogNumber := "BTLS-5234",
                  Vendor := 529,
    END_ELEMENT

    ELEMENT Mick (Item := "SeaMonkeys",
                  ItemID := 8,
                  CatalogNumber := "SMKY-1978/F",
                  Vendor := 77,
    END_ELEMENT

    ELEMENT Frank (Item := "PetRock",
                   ItemID := 42,
                   CatalogNumber := "PTRK-3475/B",
                   Vendor := 82,
    END_ELEMENT

    ELEMENT Joe (Item := "SeaMonkeys",
                 ItemID := 8,
                 CatalogNumber := "SMKY-1979/A",
                 Vendor := 77,
    END_ELEMENT
以下是它当前的输出:

Here's the result: ELEMENT Kurt (Item := "BrightLite", ItemID := 29, CatalogNumber := "BTLT-9274", Vendor := 100, END_ELEMENT ELEMENT Mick (Item := "PetRock", ItemID := 36, CatalogNumber := "PTRK-3475/A", Vendor := 82, END_ELEMENT ELEMENT Kurt (Item := "SeaMonkeys", ItemID := 12, CatalogNumber := "SMKY-1978/E", Vendor := 77, END_ELEMENT ELEMENT Joe (Item := "Pong", ItemID := 24, CatalogNumber := "PONG-1482", Vendor := 5, END_ELEMENT ***** Found Shane's SMKY-1978 SeaMonkeys. (counter: 1) ***** ELEMENT Kurt (Item := "Battleship", ItemID := 99, CatalogNumber := "BTLS-5234", Vendor := 529, END_ELEMENT ***** Found Mick's SMKY-1978 SeaMonkeys. (counter: 0) ***** ELEMENT Frank (Item := "PetRock", ItemID := 42, CatalogNumber := "PTRK-3475/B", Vendor := 82, END_ELEMENT ELEMENT Joe (Item := "SeaMonkeys", ItemID := 8, CatalogNumber := "SMKY-1979/A", Vendor := 77, END_ELEMENT
在你的正则表达式开始时,.+是贪婪的。这意味着它将匹配最大字符数

你的正则表达式写得更好,它会更可读,速度更快

my $re=qr/\sELEMENT\s(.+?)\s\(Item := "$item".+?CatalogNumber := "$catNum.+?END_ELEMENT/;
我想你可以简单地重复这场比赛:

sub parseData {
    my $re=qr/\sELEMENT\s(.+?)\s\(Item := "$item".+?CatalogNumber := "$catNum.+?END_ELEMENT(.+)/;
    foreach my $counter (0..$maxInstancesToReplace) {
      # Stick in a temporary text placeholder that I will replace later after more processing
      $DataToParse =~ s/$re/ ***** Found $1\'s $catNum $item. (counter: $counter) *****$2/s;
    } 
    print("Here's the result:\n$DataToParse\n");
}

如果无法重复,则应使用/e正则表达式修饰符。

+在正则表达式的开头是贪婪的。这意味着它将匹配最大字符数

你的正则表达式写得更好,它会更可读,速度更快

my $re=qr/\sELEMENT\s(.+?)\s\(Item := "$item".+?CatalogNumber := "$catNum.+?END_ELEMENT/;
我想你可以简单地重复这场比赛:

sub parseData {
    my $re=qr/\sELEMENT\s(.+?)\s\(Item := "$item".+?CatalogNumber := "$catNum.+?END_ELEMENT(.+)/;
    foreach my $counter (0..$maxInstancesToReplace) {
      # Stick in a temporary text placeholder that I will replace later after more processing
      $DataToParse =~ s/$re/ ***** Found $1\'s $catNum $item. (counter: $counter) *****$2/s;
    } 
    print("Here's the result:\n$DataToParse\n");
}

如果无法重复,则应使用/e regex修饰符。

最佳解决方案似乎是抓住每个元素。。。数据和正则表达式中的END_元素节一次只包含一个节,而不是一次将整个完整的数据集提供给正则表达式。这并不完全是我想要完成的,但是我重写了我的程序来做这个零碎的处理,它工作起来很有魅力

最好的解决方案似乎是抓住每个元素。。。数据和正则表达式中的END_元素节一次只包含一个节,而不是一次将整个完整的数据集提供给正则表达式。这并不完全是我想要完成的,但是我重写了我的程序来做这个零碎的处理,它工作起来很有魅力

我尝试了这个答案中的代码,但它似乎与数据集中的任何内容都不匹配。我试着逃避你的双引号和其他一些事情,但没有运气。请在发布前测试您的答案。我尝试了此答案中的代码,但它似乎与数据集中的任何内容都不匹配。我试着逃避你的双引号和其他一些事情,但没有运气。请在发布前测试您的答案。下面的答案指出这是错误的。这很有帮助,但不属于答案,所以我会看看是否可以删除。下面的答案指出这是错误的。这是有帮助的,但不属于一个答案,所以我会看看是否可以删除。