我想匹配给定字符串中的变量字符,但是从最后开始。 如何做这个动作的想法?
例如:
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";
}
}
感谢您的协助。
答案 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";