使用正则表达式使用perl下划线检索字符串的一部分?

时间:2013-03-14 04:31:01

标签: regex perl

我有一串这样的文字:

20130312214255_HD7870Crossfire_Crysis3_1920x1080
20130312221402_HD7870Crossfire_SleepingDogs_1920x1080
20130313133415_HD7870CrossFire_Crysis3_5760x1080

我想要回归的是:

Crysis3_1920x1080

SleepingDogs_1920x1080

Crysis3_5760x1080

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

8 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

perl -lne 'print $1 if(/Crossfire_(.*)/)'

答案 2 :(得分:1)

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

perl -ple'$_=substr$_,31' file

答案 3 :(得分:1)

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

use strict;
use warnings;

my $string = '20130312221402_HD7870Crossfire_SleepingDogs_1920x1080';
my ($datetime, $card, $game, $resolution) = split /_/, $string;

答案 4 :(得分: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;

答案 5 :(得分:0)

一种方式:

perl -F_ -ape '$_=join "_",@F[-2,-1];' file

答案 6 :(得分:0)

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

[^_ ]*_[0-9]{4}[xX][0-9]{4}

答案 7 :(得分:0)

$a="20130312214255_HD7870Crossfire_Crysis3_1920x1080";
if($a=~m/Crossfire_(.*)/){
    print $1;
}