Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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 Perl正则表达式:将文本与可选的多行匹配_Regex_Arrays_Perl - Fatal编程技术网

Regex Perl正则表达式:将文本与可选的多行匹配

Regex Perl正则表达式:将文本与可选的多行匹配,regex,arrays,perl,Regex,Arrays,Perl,我正在尝试从Linux Make文件中提取对象文件。以下是一些例子: 英特尔E1000E: e1000e-objs := 82571.o ich8lan.o 80003es2lan.o \ mac.o manage.o nvm.o phy.o \ param.o ethtool.o netdev.o ptp.o Chelsio T3: cxgb3-objs := cxgb3_main.o ael1002.o vsc8211.o t3_hw.o mc5.o \

我正在尝试从Linux Make文件中提取对象文件。以下是一些例子:

英特尔E1000E:

e1000e-objs := 82571.o ich8lan.o 80003es2lan.o \
       mac.o manage.o nvm.o phy.o \
       param.o ethtool.o netdev.o ptp.o
Chelsio T3:

cxgb3-objs := cxgb3_main.o ael1002.o vsc8211.o t3_hw.o mc5.o \
       xgmac.o sge.o l2t.o cxgb3_offload.o aq100x.o
动脉粥样硬化:

alx-objs := main.o ethtool.o hw.o
考虑到有多行是可选的,并且可能有两行以上,如何生成返回后面内容的正则表达式:=考虑到有多行是可选的?请注意,反斜杠是Makefile内容的一部分

我只知道如何手动指定新行数,例如:

$obj_files_no_ext = "e1000";
my @filestmp = ($Makefile_contents =~ m/$obj_files_no_ext-objs\s*[\+\:]= (.*)\\\s*\n(.*)/g);

您可以尝试以下模式:

(?>$obj_files_no_ext-objs\s*:=|\G)\s*\K(?>[^\s.]++|\.(?!o(?:\s|$)))++\.o
图案详情:

(?>                    # open an atomic group
    $obj_files_no_ext  # radical
    -objs\s*:=         
  |                    # OR
    \G                 # contiguous match
)                      # close the atomic group
\s*\K                  # optional spaces and reset all the match
(?>                    # open an atomic group (filename possible characters)
    [^\s.]++           # all that is not a white character or a dot (1+ times)
  |                    # OR
    \.(?!o(?:\s|$))    # a dot not followed by "o", a space or the string end 
)++                    # repeat the atomic group one or more times
\.o           
例如:

#!/usr/bin/perl
use strict;
use warnings;

my $Makefile_contents = q{e1000e-objs := 82571.o ich8lan.o 80003es2lan.o 
   mac.o manage.o nvm.o phy.o 
   param.o ethtool.o netdev.o ptp.o};

my $obj_files_no_ext = "e1000e";
my $reg = qr/(?>$obj_files_no_ext-objs\s*:=|\G)\s*\K(?>[^\s.]++|\.(?!o(?:\s|$)))++\.o/;
my @filestmp =  $Makefile_contents =~ /$reg/g;
print join(" ",@filestmp);
您可以尝试以下方法:

$obj_files_no_ext-objs\s*:=\s*((?:(?:[^\s\\]*?\.o)[\s\n\r\\]*)+)

这将捕获属于组1中某个
$obj\u files\u no\u ext
的所有对象文件。

$obj\u files\u no\u ext是一个变量。我试图编辑帖子以删除第一个\但我至少需要更改6个字符。@PeterSenna我不明白,请您进一步解释一下好吗?
$obj\u files\u no\u ext
是一个变量,在OP的示例中,regex实际上将被
e1000
@PeterSenna Ahhh替代。很抱歉,我错过了它,我不使用PERL,所以我认为您必须避开它。总之,一切正常吗?@Sniffer老实说,我也不确定我测试的另一部分xd只返回第一个\之前的内容,而且在一些文件中可能有多行以e1000e objs+=,这就是我使用($str=~m/../g)的原因。图案细节很有说明性。谢谢。@PeterSenna:是的,因为(正如您在示例代码中所看到的),我假设斜杠在这里只是为了说明有换行符的事实,而不是真正在这里。奇怪的是,这些斜杠出现在你的数据中,也许你以前能避免吗?@PeterSenna:如果你愿意,你可以用
\G\s*\\?
替换
\G\s*\\?
来纠正这个问题。是的,我以前可以指定这个,对不起。我在问题上加了一条注释。