如何使用正则表达式匹配文本的结尾部分

时间:2015-08-25 23:24:57

标签: regex perl

我的文本文件格式如下:

[foo]
foo1=1
foo2=2

[goo]
goo1=1
goo2=2

[bar]
bar1=1
bar2=2

目标是在给定标题名称的情况下提取整个列表。例如,给定标题名称foo,使用正则表达式\[foo\](?:.|\s)+?\[我可以提取foo及其后续列表。给定goo和正则表达式\[goo\](?:.|\s)+?\[我可以将goo及其列表排除。比如shown in regex101

perl实现:

sub getListOfSettingFromKey {
    my $key  = shift;
    my $text = shift;
    my $pattern = "\\[$key\\](?:.|\\s)+?\\[";
    my $regex   = qr/$pattern/;
    if ($text =~ $regex) {
        return $&;
    }
    return "";
}

但是,这种方式适用于除了最后一部分之外的所有部分,bar,因为最后没有匹配[。那么如何匹配最后一部分?

2 个答案:

答案 0 :(得分:5)

不是正则表达式,但Perl的Config::Tiny非常适合阅读(和写作)这些" ini"文件类型。

use warnings;
use strict;

use Config::Tiny;

my $conf = Config::Tiny->read('data.txt');

print "$conf->{bar}{bar2}\n";

答案 1 :(得分:-1)

我不理解您的问题,但是,您可以尝试以下某种模式以满足您的要求:

  • /(?:\[?(?:foo|bar)\]?(?:\d\=\d)?)/g将匹配 foo & bar (包括属性)
  • /(?:\[?foo\]?(?:\d\=\d)?)/g只会匹配 foo ,包括它的属性。
  • /(?:\[?foo\]?(?:\d\=\d)?|\[bar\])/g将匹配 foo ,包括其属性和

更新#1

使用以下模式:/(\[(?:foo|bar|goo)\](?:(?!\[(?:foo|bar|goo)\])[\s\S])*)/g