从末尾匹配Perl中的字符串中的变量

时间:2016-11-24 07:42:36

标签: regex perl

我想匹配给定字符串中的变量字符,但是从最后开始。 如何做这个动作的想法?

例如:

sub removeCharFromEnd {
    my $string = shift;
    my $char = shift;
    if($string =~ m/$char/){ // I want to match the char, searching from the end, $doesn't work
        print "success";
    }

}

感谢您的协助。

4 个答案:

答案 0 :(得分:0)

没有regex modifier会强制Perl正则表达式引擎从右到左解析字符串。因此,实现这一目标的最方便的方法是通过否定前瞻:

m/$char(?!.*$char)/

(?!.*$char)否定前瞻将需要在除了换行符之外的任何0+字符之后缺少{=将失败匹配(如果找到)$char(如果您使用s修饰符正在对多行字符串输入运行正则表达式。)

答案 1 :(得分:0)

正则表达式引擎从左到右工作。

您可以使用量词的自然贪婪来到达字符串的末尾,并使用回溯机制找到最后一个字符:

if($string =~ m/.*\K$char/s) { ...

\K标记匹配结果的开头位置。

其他方式:

  • 您也可以反转字符串并使用之前的模式。

  • 您可以搜索所有匹配项并获取列表中的最后一项

答案 2 :(得分:0)

我无法理解你想要的东西。您的子例程被称为removeCharFromEnd,因此如果它出现在字符串的末尾,您可能希望从$char中删除$string

你可以这样做

sub removeCharFromEnd {
    my ( $string, $char ) = @_;

    if ( $string =~ s/$char\z// ) {
        print "success";
    }

    $string;
}

或者您可能希望删除$char last 出现位置。你可以用

做到这一点
s/.*\K$char//

我写的子程序返回修改后的字符串,因此您必须将结果分配给变量以保存它。你可以写

my $s = 'abc';
$s = removeCharFromEnd($s, 'c');
say $s;

输出

ab

如果您只想修改字符串,则应编写

$ARGV[0] =~ s/$char\z//

使用您选择的替代品。然后你可以这样做

my $s = 'abc';
removeCharFromEnd($s, 'c');
say $s;

这会产生相同的输出

答案 3 :(得分:0)

要让Perl从字符串末尾搜索,请反转字符串。

sub removeCharFromEnd {
    my $string =           reverse shift @_;
    my $char   = quotemeta reverse shift @_;

    $string =~ s/$char//;
    $string = reverse $string;

    return $string;
}

print removeCharFromEnd(qw( abcabc b )), "\n";
print removeCharFromEnd(qw( abcdefabcdef c )), "\n";
print removeCharFromEnd(qw( !"/$%?&*!"/$%?&* $ )), "\n";