Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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_Pcre - Fatal编程技术网

使用regex解析许可证文件

使用regex解析许可证文件,regex,perl,pcre,Regex,Perl,Pcre,我想解析一个许可证文件,它以某种方式包含如下内容 组件=“A0000 B0000 G0000” 文件中必须有引号,用于标记包中组件的开始和结束。我已经在上测试了组合,但这并不能解决问题 regex(“?(?\w+*\s?”)用于字符串“A0000 B0000 G0000”,并返回我需要的组件的各个值:A0000、B0000等等 但是当我测试(组件|包)=(“?(?\w+\s?”)时,块无法返回这些值,只返回第一个值,即A0000 我需要帮助提取所有这些单独的值。请帮忙。我将在这里建议一种不同的方

我想解析一个许可证文件,它以某种方式包含如下内容

组件=“A0000 B0000 G0000”

文件中必须有引号,用于标记包中组件的开始和结束。我已经在上测试了组合,但这并不能解决问题

regex
(“?(?\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
    -匹配重置运算符(丢弃当前匹配的文本)
  • [^\s”]+
    -1个或多个字符,空白和双引号除外

你的意思是你想要这样的东西吗?如果引号是必需的,为什么你要在它们后面加一个“?”量词?另外,你的第二个正则表达式会在\w+后面加上\s,但不会重复这种模式,所以它只捕获一个字段就不足为奇了。
PACKAGES=…
是如何做到这一点的r那是什么?它们与
组件
行有什么关系,或者它们是完全独立的?Pranay,当你用
perl
标记问题时,你是指perl 5语言还是你正在使用的语言中的任何特定选项(如r)?@WiktorStribiżew您的解决方案有效。我不明白,如果正则表达式中包含前几行和后几行,为什么它不会复制到文件的其他部分。我在标记中包含
perl
,因为正则表达式是用perl语言编写的。我希望您同意我对您答案的编辑。我可能过于挑剔了是时候了。如果你不同意我的观点,欢迎你把它回滚。基本上,我想要两个值,比如一个包中有多少个组件,因为文件是这样写的。我想写一个正则表达式,因为有多组这样的耦合,其中可能有一些捕获组是可选的。我使用了一些您的答案是将它们拆分为不同的正则表达式。@ikegami是的,这似乎更有可能,谢谢。已编辑
/(\w+)\s*=\s*"?[^"]+)/;
(?:\G(?!^)\s+|(?:COMPONENTS|PACKAGES)=")\K[^\s"]+