0

次のようなテキスト文字列があります。

20130312214255_HD7870Crossfire_Crysis3_1920x1080
20130312221402_HD7870Crossfire_SleepingDogs_1920x1080
20130313133415_HD7870CrossFire_Crysis3_5760x1080

私が返したいのは:

Crysis3_1920x1080

SleepingDogs_1920x1080

Crysis3_5760x1080

私は正規表現の経験がほとんどないので、助けが必要です。ありがとう!

4

8 に答える 8

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 に答える
1
perl -lne 'print $1 if(/Crossfire_(.*)/)'
于 2013-03-14T05:57:48.897 に答える
1

要求に応じて正規表現を使用する非常に短い方法:

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

また

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

(他のいくつかの回答のように、削除するセグメントが2つしかないとは限りません。)

于 2013-03-14T04:50:07.560 に答える
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

あなたの例によれば、正規表現でこのパターンを試してください

[^_ ]*_[0-9]{4}[xX][0-9]{4}
于 2013-03-14T04:42:12.710 に答える
0
$a="20130312214255_HD7870Crossfire_Crysis3_1920x1080";
if($a=~m/Crossfire_(.*)/){
    print $1;
}
于 2013-03-14T09:42:03.923 に答える
0

一方通行:

perl -F_ -ape '$_=join "_",@F[-2,-1];' file
于 2013-03-14T04:39:00.077 に答える