4

クローゼットの最後のアイテムから最後の言葉までを一致させようとしています。

たとえば、犬に最も近い b

「abcbdog」

「bdog」である必要があります

しかし、代わりに「bcbdog」を取得しています

「犬」の前の最後の出現「b」からのみ一致させるにはどうすればよいですか

これが私の現在の正規表現です:

/b.*?dog/si

ありがとうございました!

4

6 に答える 6

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
于 2011-10-29T19:33:39.433 に答える
4

これを試して:

/b[^b]*dog/si

Match b、次に a ではないものb(何もないことを含む)、そしてdog.

于 2011-10-29T19:28:19.583 に答える
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;
于 2011-10-29T22:15:39.773 に答える
0

あなたが犬の前の最後のキャラクターが何であるかをまだ知らないとき、これはちょうどうまくいきます:

my $str = 'abcbdog';

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

print @r;

bdogを印刷します

于 2011-10-30T19:11:35.037 に答える
0

Try this code:

~/.* b.*?dog/si
于 2014-04-30T22:30:20.447 に答える
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'
}

または、何か不足していますか?キャプチャされた文字列を変更して必要なものに一致させたい場合は、ブラケットをシフトするだけです。

于 2011-11-03T21:27:21.530 に答える