我是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=
开头,然后由|
继续。之前和之后的所有内容都是不需要的文本。如果这样的问题已经得到解答,请指导我。感谢。
答案 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