perl正则表达式匹配最接近

时间:2011-10-29 19:13:40

标签: regex perl match closest

我正试图从最后一个项目壁橱到最后一个单词匹配。

例如,最接近b的狗

“abcbdog”

应该是“bdog”

但相反,我得到了“bcbdog”

我怎样才能匹配“狗”之前的最后一次出现“b”

这是我现在的正则表达式:

/b.*?dog/si

谢谢!

6 个答案:

答案 0 :(得分:7)

正则表达式想要从左到右,但你想从右向左走,所以只需反转你的字符串,扭转你的模式,然后反转比赛:

my $search_this  = 'abcbdog';
my $item_name    = 'dog';
my $find_closest = 'b';

my $pattern = reverse($item_name)
            . '.*?'
            . reverse($find_closest);

my $reversed     = reverse($search_this);
$reversed        =~ /$pattern/si;
my $what_matched = reverse($&);
print "$what_matched\n";
# prints bdog

答案 1 :(得分:4)

试试这个:

/b[^b]*dog/si

匹配b,然后匹配b(不包括任何内容),然后dog

答案 2 :(得分:1)

TIMTOWTDI:

此方法甚至可以通过字符串找到多个匹配项,或者如果开始或结束字更常见,则可以进行优化。 编辑现在使用零宽度匹配,以避免删除然后添加开始和结束字符串。

#!/usr/bin/env perl

use strict;
use warnings;

use v5.10; #say

my $string = 'abcbdog';
my $start = 'b';
my $end = 'dog';

my @found = 
  grep { s/(?<=$end).*// } 
  split( /(?=$start)/, $string );

say for @found;

答案 3 :(得分:0)

当你不知道狗之前的最后一个角色是什么时,这才起作用:

my $str = 'abcbdog';

my @r = $str =~ /(.dog)/;

print @r;

打印bdog

答案 4 :(得分:0)

如果你只是试图将最接近的'b'与'狗'匹配,包括狗,你接受的答案似乎有点复杂,你只需要在你寻找贪婪的期限之前进行比赛。例如:

# First example
my $string1 = 'abcbdog';
if ( $string1 =~ /.+(b.*dog)/ ) {
    print $1;
    # Returns 'bdog'
}

# Second example, different string, same regex.
my $string2 = 'abcbmoretextdog';
if ( $string2 =~ /.+(b.*dog)/ ) {
    print $1;
    # Returns 'bmoretextdog'
}

或者我错过了什么?如果您想更改捕获的字符串以匹配您想要的字符串,只需移动括号。

答案 5 :(得分:0)

试试这段代码:

~/.* b.*?dog/si