クローゼットの最後のアイテムから最後の言葉までを一致させようとしています。
たとえば、犬に最も近い b
「abcbdog」
「bdog」である必要があります
しかし、代わりに「bcbdog」を取得しています
「犬」の前の最後の出現「b」からのみ一致させるにはどうすればよいですか
これが私の現在の正規表現です:
/b.*?dog/si
ありがとうございました!
正規表現は左から右に移動したいのですが、右から左に移動したいので、文字列を逆にし、パターンを逆にし、一致を逆にします:
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
これを試して:
/b[^b]*dog/si
Match b
、次に a ではないものb
(何もないことを含む)、そしてdog
.
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;
あなたが犬の前の最後のキャラクターが何であるかをまだ知らないとき、これはちょうどうまくいきます:
my $str = 'abcbdog';
my @r = $str =~ /(.dog)/;
print @r;
bdogを印刷します
Try this code:
~/.* b.*?dog/si
犬を含む「犬」に最も近い「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'
}
または、何か不足していますか?キャプチャされた文字列を変更して必要なものに一致させたい場合は、ブラケットをシフトするだけです。