如何在Perl中的符号后提取字符串?
我尝试过一些搜索,但即使是我发现的代码也没有用。
我试图在冒号后提取字符串。所以我想在冒号之后展示一切。
示例:
string = day1: string over here
substring = string over here
到目前为止,我已经尝试过:
$substring = $string=~ /(\:.*)\s*$/;
但它只会反复输出数字1。
答案 0 :(得分:9)
那是因为标量上下文中的模式匹配是布尔测试。如果要捕获括号内容(捕获组),则需要列表上下文。如果列表只是一个元素,那就没问题了:
试试这个:
my ( $substring ) = $string=~ /(\:.*)\s*$/;
差异可能有点微妙,但基本上 - 我们正在分配所有的点击量'从模式匹配到列表......包含一个元素。
注意 - 您可以这样做:
my @matches = $string =~ m/(.)/g;
获得多次点击'回。如果你这样做,你将只获得第一场比赛 - 这与你的模式无关,但你可以这样做:
my ( $key, $value ) = $string =~ m/(\w+)=(\w+)/;
例如,。
答案 1 :(得分:3)
我通常使用括号从文本中提取部分,然后引用存储在$ 1变量中的结果。
看例子:
my $text = "day1: string over here";
print $1 if ($text =~ /:\s*(.+)$/);
但也可以通过此代码收到类似的结果:
my $text = "day1: string over here";
my ($a) = $text =~ /:\s*(.+)$/;
print $a;
答案 2 :(得分:1)
您也可以使用split函数来实现欲望子字符串:
#!/usr/bin/perl
use warnings;
use strict;
my $string = "day1: string over here";
my (undef, $substring) = split(':\s*', $string);
print $substring, "\n";
输出:
string over here
或者您可以通过在正则表达式中使用捕获组()
来实现此目的:
my $string = "day1: string over here";
$string =~ m/(.*)\:\s+(.*)$/;
my $substring = $2;
print $substring, "\n";