使用perl中的regex在两个字符串分隔符之间检索字符串

时间:2016-02-16 06:37:41

标签: regex perl

我已经做了一段时间了,现在似乎无法解决这个问题。我有一个包含一堆行的文件,所有行的结构都类似于下面的行,这意味着每一行都以&#34;!&#34;开头。并有三个分隔符&#34; <DIV>&#34;。

!the<DIV>car<DIV>drove down the<DIV>road off into the distance

我感兴趣的是检索最后一根字符串&#34;路到远处#34;我似乎无法让它发挥作用。下面我列出了我当前的代码。

while($line = <INFILE>) {
    $line =~ /<SEP>{3}(.*)/;
    print $1;
}

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:3)

声明

@b = $a =~ /^!(.*?)<DIV>(.*?)<DIV>(.*?)<DIV>(.*)/

会将字符串拆分为一个列表,然后您可以使用

提取第四个元素
$b[3]

如果你真的只想要最后一个,那就改为:

($text) = $a =~ /^!.*<DIV>(.*)/

答案 1 :(得分:3)

我不知道你是坚持正则表达式还是只是没有想到别的,但是split会很好地做到这一点

$text = (split '<DIV>', $str)[-1];

如果你经常有这样的重复模式split可能比纯正的正则表达式更好。 (当然,Split也会在其模式中使用完整的正则表达式。)

ADDED

所有这一切都可以直接完成,如果你只是需要从每一行拉出最后一件事:

open my $fh, '<', $file;
my @text = map { (split '<DIV>')[-1] } <$fh>;
close $fh;
print "$_\n" for @text;

split默认情况下使用$_,其在地图中是处理的当前元素。对于没有<DIV>的行,这将返回整行。列表上下文中的文件句柄将所有行作为列表提供;列表上下文由map强制执行。

如果您想要分隔符之间的所有文本,您可以

my @rlines = map { [ split '<DIV>' ] } <$fh>;

其中[ ]引用split返回的列表,因此@rlines包含对数组的引用,每个数组都在<DIV>行之间。领先的!就在那里,需要更多的处理。

当然,对于地图块,您可以使用Jim Garrison的答案中的{ (/.*<DIV>(.*)/)[0] }进行单个匹配,或者稍微修改正则表达式以捕捉所有内容。

如果表现是一个因素,那就是一个不同的问题。

答案 2 :(得分:0)

简单的替换也可以起作用:

PackageService.get($scope.currentUser()).then(function(response){
     $scope.packgs = response.data; //received data returned by promise
     console.log($scope.packgs); //console will give data out here only
});

答案 3 :(得分:0)

简单的正则表达式可以回答你的问题:

my $match= '';
while($line = <INFILE>) {
 ($match) = $line =~/.*<DIV>(.*)/; 
}
print $match, "\n";