1

我是 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

4 回答 4

3

您可以搜索/\|BIRTH PLACE=([^\|]+)\n\|/, [^\|]+ 中的一个或多个,而不是替换它周围的所有内容anything that is not a pipe

于 2013-02-08T15:49:34.120 回答
2
$info =~ m{\|BIRTH PLACE=(.*?)\|} or die "There is no data in \$info?!";
my $birth_place = $1;

这应该够了吧。

于 2013-02-08T15:50:25.987 回答
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";
}
于 2013-02-08T16:00:36.473 回答
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
于 2013-02-08T16:28:23.610 回答