我有以下字符串:
my $string = "<b>My Name: John Smith < /br> </br>Rest of a big text bla bla bla …";
我想把它分成3个字符串
一个人有“我的名字:”
一个人有“约翰史密斯”
还有一个文本的其余部分,即大文本的其余部分bla bla bla
问题是“约翰史密斯”是一个变种。即可以是任何名字,我想提取它。
我尝试过类似的事情:
my @vals = split (/(<b>My Name: John Smith :*+<br >)/, $string);
但这甚至都没有编译
我如何在Perl中执行此操作?
答案 0 :(得分:3)
一个简单的正则表达式应该可以工作。
my ($label, $name, $rest) = $string =~ m=<b>(.*?): (.*?) < /br> </br>(.*)=;
print "$label\n$name\n$rest\n";
请注意,<
和/
之间的空格不是HTML中的正确语法,可能无法按您的意愿呈现。
答案 1 :(得分:1)
#!/usr/bin/env perl
use utf8;
use 5.014;
use strict;
use warnings;
use open qw(:std :utf8);
use HTML::TokeParser::Simple;
my $html = q{<b>My Name: John Smith <br /> <br />Rest of a big text bla bla bla …};
my $parser = HTML::TokeParser::Simple->new(string => $html);
while (my $tag = $parser->get_tag('b')) {
my $text = $parser->get_text('br');
next unless my ($label, $name) = ($text =~ m{\A (My Name:) \s+ (.+) }xs);
$name =~ s{\s+\z}{};
$text = $parser->get_text('/b');
$text =~ s{\A\s+}{};
$text =~ s{\s+\z}{};
say "|$_|" for $label, $name, $text;
}
答案 2 :(得分:1)
my $string = "<b>My Name: John Smith < /br> </br>Rest of a big text bla bla bla …";
my @vals =
map { /(My Name:)\s*(.+)/ ? ($1,$2) : $_ }
grep length,
split /\s* <.+?> \s*/x, $string;
use Data::Dumper; print Dumper \@vals;
输出
$VAR1 = [
'My Name:',
'John Smith',
'Rest of a big text bla bla bla .'
];
答案 3 :(得分:0)
使用正则表达式和预定义变量&#34; $&#39; &#34;它指的是与正则表达式匹配的部分之后的字符串部分!