正则表达式获取所有内容直到倒数第二次出现

时间:2016-02-10 16:36:40

标签: regex perl

例如,如果我有rrr.abc.tsy.html

我只想要rrr.abc

4 个答案:

答案 0 :(得分:1)

修改字符串本身以剥离后一部分:

my $str = 'rrr.abc.tsy.html';
$str =~ s/^(.+)(\.[^.]+){2}$/\1/;

或者你可以单独留下字符串,只需抓住另一个变量中的匹配部分:

$str =~ /^(.+)(\.[^.]+){2}$/;
my $match = $1;

正则表达式的说明:

^               Match at beginning of string
(               Start capturing group 1
    .+              1 or more of any character (except newline)
)               End capturing group 1
(               Start capturing group 2
    \.              A single literal period
    [^.]+           1 or more of any character except period or newline
)               End capturing group 2
{2}             Match exactly 2 of the stuff in capturing group 2
$               Match at end of string

第二个捕获组及其2个多重符(\.[^.]+){2}匹配最后两个后缀。

第一组是“贪婪的”,在此之前就可以匹配它。

答案 1 :(得分:1)

  

我想在.txy.htm

之前获取所有内容
my $s = 'rrr.abc.txy.html';
my ($wanted) = $s =~ /^(.*?)\.txy\.html/;
say $wanted;  # rrr.abc

如果您要删除任何尾随.txy.htm

my $s = 'rrr.abc.txy.html';
$s =~ s/\.txy\.html\z//;
say $s;  # rrr.abc

如果您希望在倒数第二个.之前完成所有事情,

my $s = 'rrr.abc.txy.html';
my ($wanted) = $s =~ /^(.*)\.[^.]*\.[^.]*\z/;
say $wanted;  # rrr.abc

答案 2 :(得分:0)

如果您希望通过substrrindex获得一点创意,可以获得更快的解决方案。

my $str = 'rrr.abc.tsy.html';
my $one = substr($str, 0, rindex($str, '.')); # $one = 'rrr.abc.tsy'
my $two = substr($one, 0, rindex($one, '.')); # $two = 'rrr.abc'

我们在这里有创意。您可以将substr包装在另一个substr内,以便立即获得结果(而我的基准测试显示比使用正则表达式或拆分快300%),而不是创建一个临时变量。

my $wanted = substr($str, 0, rindex(substr($str, 0, rindex($str, '.')), '.'));
# $wanted = 'rrr.abc'

答案 3 :(得分:-1)

^

说明: 它会匹配
(.+)开始 [.]任意长度的任意字符组 [^.]*后跟一个点,
[.]然后可选地由一些非点字符组成,
[^.]*然后是另一个点
$以及可选的其他非点字符 $1直到最后

结果将在变量{{1}}中捕获。

遗憾的是,这个问题不够明确,无法理解非点球员群体是否必须是可选的。