Perl Regex,获取两个字符串之间的字符串

时间:2013-02-08 15:46:58

标签: regex perl

我是Perl的新手,并尝试使用Regex在两个标签之间获取一段字符串,我知道该字符串会在那里。我已经尝试过stackoverflow的各种答案,但似乎没有一个对我有用。这是我的例子......

所需数据位于$ info变量中,我希望从中获取有用的数据

my $info = "random text i do not want\n|BIRTH PLACE=Boston, MA\n|more unwanted random text";

上述字符串中的有用数据为Boston, MA。我通过$info =~ s/\n//g;从字符串中删除了换行符。现在$info有这个字符串"random text i do not want|BIRTH PLACE=Boston, MA|more unwanted random text"。我认为这样做可以帮助我轻松捕获所需的数据。

请帮助我获取所需数据。我确信数据始终以|BIRTH PLACE=开头,然后由|继续。之前和之后的所有内容都是不需要的文本。如果这样的问题已经得到解答,请指导我。感谢。

4 个答案:

答案 0 :(得分:3)

您可以搜索/\|BIRTH PLACE=([^\|]+)\n\|/,[^ \ |] +作为anything that is not a pipe中的一个或多个来代替其周围的所有内容。

答案 1 :(得分:1)

$info =~ m{\|BIRTH PLACE=(.*?)\|} or die "There is no data in \$info?!";
my $birth_place = $1;

这应该可以解决问题。

答案 2 :(得分:1)

你知道,实际上,这些新行可能对你有所帮助。我本来可以使用初始正则表达式:

/^\|BIRTH PLACE=(.*)$/m

使用多行修改器(m)匹配行开头的^和行尾的$,而不是仅匹配行的开头和结尾串。哎呀,你甚至可以变得非常疯狂和匹配:

/(?<=^\|BIRTH PLACE=).+$/m

要仅捕获您想要的信息,请使用lookbehind((?<= ... ))断言它是出生地信息。

为什么一旦你能做到一次就会诅咒两次?

所以,在perl:

if ($info =~ m/(?<=^\|BIRTH PLACE=).+$/m) {
    print "Born in $&.\n";
} else {
    print "From parts unknown";
}

答案 3 :(得分:1)

您可能已从文件中读取此数据,这是一个糟糕的开始。你的程序应该是这样的

use strict;
use warnings;

use autodie;

open my $fh, '<', 'myfile';

my $pob;
while (<$fh>) {
  if (/BIRTH PLACE=(.+)/) {
    $pob = $1;
    last;
  }
}

print $pob;

<强>输出

Boston, MA