我的文本文件格式如下:
[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
,因为最后没有匹配[
。那么如何匹配最后一部分?
答案 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 ,包括其属性和栏 使用以下模式:/(\[(?:foo|bar|goo)\](?:(?!\[(?:foo|bar|goo)\])[\s\S])*)/g