我已经做了一段时间了,现在似乎无法解决这个问题。我有一个包含一堆行的文件,所有行的结构都类似于下面的行,这意味着每一行都以&#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;
}
非常感谢任何帮助!
答案 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";