使用regex解析许可证文件
我想解析一个许可证文件,它以某种方式包含如下内容 组件=“A0000 B0000 G0000” 文件中必须有引号,用于标记包中组件的开始和结束。我已经在上测试了组合,但这并不能解决问题 regex使用regex解析许可证文件,regex,perl,pcre,Regex,Perl,Pcre,我想解析一个许可证文件,它以某种方式包含如下内容 组件=“A0000 B0000 G0000” 文件中必须有引号,用于标记包中组件的开始和结束。我已经在上测试了组合,但这并不能解决问题 regex(“?(?\w+*\s?”)用于字符串“A0000 B0000 G0000”,并返回我需要的组件的各个值:A0000、B0000等等 但是当我测试(组件|包)=(“?(?\w+\s?”)时,块无法返回这些值,只返回第一个值,即A0000 我需要帮助提取所有这些单独的值。请帮忙。我将在这里建议一种不同的方
(“?(?\w+*\s?”)
用于字符串“A0000 B0000 G0000”,并返回我需要的组件的各个值:A0000、B0000等等
但是当我测试(组件|包)=(“?(?\w+\s?”)
时,块无法返回这些值,只返回第一个值,即A0000
我需要帮助提取所有这些单独的值。请帮忙。我将在这里建议一种不同的方法。你的正则表达式模式越来越复杂,这不是一个好主意 问题的核心是,要进行重复匹配,您也在匹配前缀文本,显然,这只能匹配一次 但是,与其试图让你的正则表达式模式变得更加复杂,答案是以不同的方式处理这个问题
#/usr/bin/env perl
严格使用;
使用警告;
使用数据::转储程序;
我的%conf=do{local$/;}=~m/(\w+)=“([^”]+)”/xg;
打印转储程序\%conf;
__资料__
组件=“A0000 B0000 G0000”
软件包=“C0000 D0000 E0000”
这将创建一个数据结构
$VAR1={
“组件”=>“A0000 B0000 G0000”,
“软件包”=>“C0000 D0000 E0000”
};
如果您想要单独的值
$\ux=[split]用于值%conf;
打印转储程序\%conf;
这在功能上等同于此
foreach my$key(key%conf){
#将值拆分为空白。
my@stuff=split“”,$conf{$key};
#将其替换为您的阵列。
$conf{$key}=\@stuff;
}
产生
$VAR1={
“软件包”=>[
‘C0000’,
“D0000”,
‘E0000’
],
“组件”=>[
“A0000”,
‘B0000’,
“G0000”
]
};
现在你可以写这个了
foreach my$value(@{$conf{'COMPONENTS'}}){
打印$value,“\n”;
}
我可能误解了这个问题,但简单的问题呢
my %result;
while (<$fh>) {
my ($type, $components) = /(\w+)\s*=\s*"([^"]+)/;
push @{$result{$type}}, split ' ', $components; # all in one arrayref
#push @{$result{$type}}, [ split ' ', $components ]; # or as separate ones
}
其中,[…]
是一个arrayref,包含该关键字所有行中的组件
或者,如果使用代码中注释掉的行而不是上面的行
(
COMPONENTS => [ ['A0000', 'B0000', 'G0000'], [ ... ], ... ],
PACKAGES => [ [ ... ], [ ... ], ... ],
)
由于我的解决方案适用于您,因此不需要处理尾随的一个,因为需要匹配其余的数据,我发布了一个答案:
(?:\G(?!^)\s+|(?:COMPONENTS|PACKAGES)=")\K[^\s"]+
模式匹配:
-两个备选方案之一:(?:\G(?!^)\s+|(?:组件|包)=”)
-上一个匹配的结尾(\G(?!^)\s+
匹配行/字符串的开头或上一个匹配的结尾,因此\G
将“减去”字符串位置的开头)和1+空格(?!^)
-或|
-要么(?:组件|包)=
要么组件=
包=
-匹配重置运算符(丢弃当前匹配的文本)\K
-1个或多个字符,空白和双引号除外[^\s”]+
PACKAGES=…
是如何做到这一点的r那是什么?它们与组件
行有什么关系,或者它们是完全独立的?Pranay,当你用perl
标记问题时,你是指perl 5语言还是你正在使用的语言中的任何特定选项(如r)?@WiktorStribiżew您的解决方案有效。我不明白,如果正则表达式中包含前几行和后几行,为什么它不会复制到文件的其他部分。我在标记中包含perl
,因为正则表达式是用perl语言编写的。我希望您同意我对您答案的编辑。我可能过于挑剔了是时候了。如果你不同意我的观点,欢迎你把它回滚。基本上,我想要两个值,比如一个包中有多少个组件,因为文件是这样写的。我想写一个正则表达式,因为有多组这样的耦合,其中可能有一些捕获组是可选的。我使用了一些您的答案是将它们拆分为不同的正则表达式。@ikegami是的,这似乎更有可能,谢谢。已编辑
/(\w+)\s*=\s*"?[^"]+)/;
(?:\G(?!^)\s+|(?:COMPONENTS|PACKAGES)=")\K[^\s"]+