0

我有一串这样的文本:

20130312214255_HD7870Crossfire_Crysis3_1920x1080
20130312221402_HD7870Crossfire_SleepingDogs_1920x1080
20130313133415_HD7870CrossFire_Crysis3_5760x1080

我要返回的是:

Crysis3_1920x1080

SleepingDogs_1920x1080

Crysis3_5760x1080

我对正则表达式的经验很少,可以使用一些帮助。谢谢!

4

8 回答 8

1
perl -lne 'print $1 if(/Crossfire_(.*)/)'
于 2013-03-14T05:57:48.897 回答
1

一种非常简短的方法,根据要求使用正则表达式:

perl -ple'($_)=/([^_]+_[^_]+$)/' file

或者

perl -ple's/.*_(?=[^_]+_)//' file

(不要像其他一些答案那样假设只有两个部分可以删除。)

于 2013-03-14T04:50:07.560 回答
1

因为在您的示例中偏移量始终相同,您也可以使用substr来执行此操作:

perl -ple'$_=substr$_,31' file
于 2013-03-14T06:13:58.163 回答
1

他没有说它必须是一个正则表达式......

use strict;
use warnings;

my $string = '20130312221402_HD7870Crossfire_SleepingDogs_1920x1080';
my ($datetime, $card, $game, $resolution) = split /_/, $string;
于 2013-03-14T15:11:58.927 回答
0

对于单个字符串,您可以使用:

my $str = "20130312214255_HD7870Crossfire_Crysis3_1920x1080";
$str =~ s/^(?:[^_]*_){2}//;

如果它包含多个字符串,您可以执行以下操作:

my $str = <<'_STR_';
20130312214255_HD7870Crossfire_Crysis3_1920x1080
20130312221402_HD7870Crossfire_SleepingDogs_1920x1080
20130313133415_HD7870CrossFire_Crysis3_5760x1080
_STR_

my @result = $str =~ /^(?:[^_]*_){2}(\S+)/gm;
于 2013-03-14T04:36:33.060 回答
0

单程:

perl -F_ -ape '$_=join "_",@F[-2,-1];' file
于 2013-03-14T04:39:00.077 回答
0
$a="20130312214255_HD7870Crossfire_Crysis3_1920x1080";
if($a=~m/Crossfire_(.*)/){
    print $1;
}
于 2013-03-14T09:42:03.923 回答
0

根据您的示例,使用正则表达式尝试此模式

[^_ ]*_[0-9]{4}[xX][0-9]{4}
于 2013-03-14T04:42:12.710 回答