例如,如果我有rrr.abc.tsy.html
我只想要rrr.abc
答案 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)
如果您希望通过substr
和rindex
获得一点创意,可以获得更快的解决方案。
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}}中捕获。
遗憾的是,这个问题不够明确,无法理解非点球员群体是否必须是可选的。