[英]Trying to get two substring from a string using regex in Perl
我试图建立一个正则表达式,它获取以下字符串:
Invalid version of perl: 5.8.7
格式:
Invalid version of _: _
我想知道是否可以在一行中获得语言名称和版本,例如: my ($language,$version) =~ /.../
。
因此输出将是:
$language = perl
$version = 5.8.7
也许可以通过if-else完成?
这是基本的正则表达式,因此请务必阅读例如perlretut或Jeffrey EF Friedl 撰写的 “ Mastering Regular Expressions” 。
当然是TMTOWDTI ,但这是其中之一:
#!/usr/bin/perl
use strict;
use warnings;
my $input = "Invalid version of perl: 5.8.7";
my($language, $version) = ($input =~ /(\w+):\s+(\d+(?:\.\d+)*)/)
or die "Can't detect language or version!\n";
print "'${language}' '${version}'\n";
exit 0;
输出量
$ perl dummy.pl
'perl' '5.8.7'
您可以使用“捕获”从字符串中提取多个值。 基本版本是这样的。 通过用(...)
包围文本,可以在匹配的正则表达式中捕获文本。 在此示例中,我们将提取“:”两侧的非空白字符。
use feature 'say'; # for "say()"
$_ = 'Invalid version of perl: 5.8.7';
if (/(\S+): (\S+)/) {
say "Language = $1";
say "Version = $2";
}
捕获的文本放入名为$1
和$2
变量中。 注意,我们将整个匹配项放在if
语句中,以确保在显示任何内容之前,我们的正则表达式匹配。
使您的代码更易于理解的另一种方法是将匹配数据复制到命名变量中,如下所示:
use feature 'say'; # for "say()"
$_ = 'Invalid version of perl: 5.8.7';
if (my ($language, $version) = /(\S+): (\S+)/) {
say "Language = $language";
say "Version = $version";
}
正如其他人指出的那样,如果您是该语言的新手,那么Perl文档非常值得阅读。 在这种情况下,您应该花一两个小时研究perlretut 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.