在Perl中获取字符串中的尾部斜杠数

时间:2015-09-30 18:22:03

标签: regex perl

在Perl中有一种方法可以在给定的字符串中获得大量的斜杠,理想情况是在一行中吗?例如,如果字符串为abc\\\,则返回3

我知道如何在多行上执行此操作,但我一直在寻找一种允许我在线进行此操作的解决方案,例如:在if语句条件中。

谢谢!

3 个答案:

答案 0 :(得分:5)

perlop

  

在列表上下文中匹配

     

如果" / g"选项未被使用," m //"在列表上下文中返回一个列表,该列表由模式中括号匹配的子表达式组成,即($ 1,$ 2,$ 3 ...)

我们可以通过(...)[0]强制列表上下文,它将返回其第一个元素,即$1

$string = 'abc\\\\\\';
print "yes\n" if 3 == length(($string =~ /(\\+)$/)[0]);

或,以防止警告

print "yes\n" if 3 == (length(($string =~ /(\\+)$/)[0]) // 0); # 5.10+

但是,如果您知道如何在多行上执行此操作,只需将解决方案包装到do即可完成:

print "yes\n" if 3 == do {
    my $count = 0;
    my $char = q();
    $count++ while '\\' eq ($char = chop $string);
    $string .= $char . ('\\' x $count);
    $count
};

答案 1 :(得分:4)

use strict; 
use warnings; 

sub number_trailing_slashes {
   my ($string) = @_;
   return 0 unless $string; 

   my ($slashes) = $string =~ m/(\\*)$/;
   return length($slashes);
}

# note that to pass a string with three backslashes, you need to escape
# them once in the source string
say number_trailing_slashes("abc\\\\\\"); # 3

答案 2 :(得分:3)

一些解决方案:

  • $s =~ /(\\*)\z/, length($1) # Use in scalar context.

  • $s =~ /(\\+)\z/ ? length($1) : 0

  • length(( $s =~ /(\\*)\z/ )[0])

  • $s =~ s/^.*[^\\\\]//s, length($s) # Destructive. Use in scalar context.

  • length( $s =~ s/^.*[^\\\\]//sr ) # Requires Perl 5.14+.

最后两个应该是最快的,因为它们从字符串的结尾开始。