Regex将获得所有信息,直到第二次出现

Regex将获得所有信息,直到第二次出现,regex,perl,Regex,Perl,例如,如果我有rrr.abc.tsy.html 我只希望rrr.abc修改字符串本身以去除后一部分: my$str='rrr.abc.tsy.html'; $str=~s/^.+\.[^.]+{2}$/\1/; 或者,您可以不使用字符串,只需获取另一个变量中的匹配部分: $str=~/^.+\.[^.]+{2}$/; 我的$match=$1; 正则表达式的解释: ^在字符串的开头匹配 开始捕获组1 .+1个或多个字符,换行符除外 结束捕获组1 开始捕获第2组 \.一个文字句号 [^.]+1个或多

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


我只希望rrr.abc

修改字符串本身以去除后一部分:

my$str='rrr.abc.tsy.html'; $str=~s/^.+\.[^.]+{2}$/\1/; 或者,您可以不使用字符串,只需获取另一个变量中的匹配部分:

$str=~/^.+\.[^.]+{2}$/; 我的$match=$1; 正则表达式的解释:

^在字符串的开头匹配 开始捕获组1 .+1个或多个字符,换行符除外 结束捕获组1 开始捕获第2组 \.一个文字句号 [^.]+1个或多个字符,句号或换行符除外 第二组 {2} 精确匹配捕获组2中的2个内容 字符串末尾的$Match 第二个捕获组及其2个乘法器\.[^.]+{2}匹配最后两个后缀

第一组是贪婪的,在那之前它能匹配的一切

^(.+)[.][^.]*[.][^.]*$
说明: 它会匹配的 ^从一开始 .+一组任意长度的任意字符 [.]后面跟一个点, [^.]*然后可选地通过一些非点字符, 然后是另一个点 [^.]*并可选择使用其他非点字符 美元到最后

结果将捕获在变量$1中

不幸的是,这个问题还不够清楚,无法理解非点字符组是否必须是可选的

我想在.txy.htm之前获得所有信息

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

相反,如果你想在最后一秒之前得到一切


如果您想在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中以立即获得结果,而我的基准测试表明,这比使用regex或split快300%

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

你的意思是把最后两部分用一个周期分开吗?直到第二个到最后一个发生什么?字母后跟一个点?更多的例子会有所帮助。例如:rrr.abc.txy.html我想在之前获取所有信息。txy.html我认为您需要显示更多代码。我知道rrr.abc.tsy.html告诉我们的很少,这些字段是在Perl数组中还是在单个Perl字符串中?如果您可以发布创建这些值的代码,那么我们将能够帮助更好的人/^.+\..[^.]+{2}$/\1/可以简化为s/?:\.[^.]+{2}\z//。+应该是*$str=~/^.+\.[^.]+{2}$/;我的$match=$1;这是一辆马车$如果匹配失败,则匹配包含未知内容。我的$match=$str=~/^.+\.[^.]+{2}$/;避免这些问题。更好的是,我的$match=$str=~/^.*\.[^.]*{2}\z/@ikegami存在+而不是*是为了避免匹配“.foo.bar”并返回。在任何情况下,我都不会进一步完善这个问题,除非OP更新了这个问题,因为目前还不清楚。。。
my $s = 'rrr.abc.txy.html';
my ($wanted) = $s =~ /^(.*)\.[^.]*\.[^.]*\z/;
say $wanted;  # rrr.abc
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'
my $wanted = substr($str, 0, rindex(substr($str, 0, rindex($str, '.')), '.'));
# $wanted = 'rrr.abc'