[英]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.