在Perl中,如何找到字符串中最后一位数字的索引?示例:最后一位的Hello123xyz索引为7
Hello123xyz
7
tf7tbtn21#
RE匹配字符串中的最后一个数字,@- variable获取匹配开始的索引:
@-
#!/usr/bin/env perl use warnings; use strict; use feature qw/say/; sub last_digit_index($) { if ($_[0] =~ /\d\D*\z/) { return $-[0]; } else { return -1; } } say last_digit_index("Hello123xyz"); # 7
yhxst69z2#
我可能会在这里使用pos函数。与/g匹配,Perl会记住匹配停止的位置。该字符串上的下一个全局匹配将从上一个匹配停止的位置开始,因此将其隔离在子或块中,以避免对同一变量上的后续匹配产生奇怪的影响。由于位置从0开始计数,因此下一个位置将比最后一位从1开始的位置大1。您可以决定是否要减去1:
pos
/g
use v5.10; say last_digit_pos('Hello123xyz'); sub last_digit_pos { my( $string ) = @_; $string =~ m/^.*\d/sg; return pos($string); # 6 }
而且,如果字符串不匹配,pos不返回定义的值。
ibrsph3r3#
还可以利用List::MoreUtils::last_index
use List::MoreUtils qw(last_index); my $last_digit_index = last_index { /[0-9]/ } split '', $string;
我觉得这很简单:使用split的典型用法将字符串分解为字符列表,并使用库通过普通正则表达式查找最后一个数字。请注意,这是“昂贵的”,因为它为每个字符创建一个标量,并多次运行regex。因此,如果效率很重要--如果这是在一个绝对巨大的字符串上完成的,或者是在较小的字符串上多次完成的--那么最好寻找其他方法,或者至少在决定使用它之前对其进行基准测试。(注意,这必须是 * 非常多 * 的字符串才能看到效率的下降。)
split
3条答案
按热度按时间tf7tbtn21#
RE匹配字符串中的最后一个数字,
@-
variable获取匹配开始的索引:yhxst69z2#
我可能会在这里使用
pos
函数。与/g
匹配,Perl会记住匹配停止的位置。该字符串上的下一个全局匹配将从上一个匹配停止的位置开始,因此将其隔离在子或块中,以避免对同一变量上的后续匹配产生奇怪的影响。由于位置从0开始计数,因此下一个位置将比最后一位从1开始的位置大1。您可以决定是否要减去1:
而且,如果字符串不匹配,
pos
不返回定义的值。ibrsph3r3#
还可以利用List::MoreUtils::last_index
我觉得这很简单:使用
split
的典型用法将字符串分解为字符列表,并使用库通过普通正则表达式查找最后一个数字。请注意,这是“昂贵的”,因为它为每个字符创建一个标量,并多次运行regex。因此,如果效率很重要--如果这是在一个绝对巨大的字符串上完成的,或者是在较小的字符串上多次完成的--那么最好寻找其他方法,或者至少在决定使用它之前对其进行基准测试。(注意,这必须是 * 非常多 * 的字符串才能看到效率的下降。)