私は次のテキストを持っています
tooooooooooooon
私が読んでいるこの本によると、?任意の量指定子の後に続くと、貪欲ではなくなります。
私の正規表現to*?nはまだ返されてtooooooooooooonいます。
返すtonべきじゃないですか。
理由はありますか?
私は次のテキストを持っています
tooooooooooooon
私が読んでいるこの本によると、?任意の量指定子の後に続くと、貪欲ではなくなります。
私の正規表現to*?nはまだ返されてtooooooooooooonいます。
返すtonべきじゃないですか。
理由はありますか?
正規表現は、実際に存在するテキストの断片にのみ一致できます。
部分文字列「ton」は文字列のどこにも存在しないため、一致の結果にはなりません。一致すると、元の文字列の部分文字列のみが返されます
編集:明確にするために、以下の文字列を使用している場合は、余分な「n」を使用します
toooooooonoooooon
この正規表現 (「o」を指定しない)
t.*n
次のものに一致します (「n」の前にできるだけ多くの文字)
toooooooonoooooon
しかし、正規表現
t.*?n
次のものにのみ一致します (「n」の前の文字はできるだけ少なくします)
toooooooon
正規表現は常にマッチしようとします。
あなたの表現はこう言っています:
't' の後に *できるだけ少ない* 'o' が続き、その後に 'n' が続きます。
つまり、最後に「n」があり、式が到達しようとしているため、必要なすべての o が一致することを意味します。すべての o が一致することが、成功する唯一の可能性です。
正規表現は、それらのすべてに一致しようとします。n に一致するすべての o よりも一致する 'o' が少なくないため、すべてが一致します。また、o* を使用しているからですか? o+の代わりに?o が存在する必要はありません。
例、Perl
$a = "toooooo";
$b = "toooooon";
if ($a =~ m/(to*?)/) {
print $1,"\n";
}
if ($b =~ m/(to*?n)/) {
print $1,"\n";
}
~>perl ex.pl
t
toooooon
正規表現は常に一致するように最善を尽くします。/o*?/この場合に行う唯一のことは、パーサーをノードにバックトラックさせることで、パーサーを遅くすることです。のすべてのシングル'o'に1 回"tooooon"。通常のマッチングでは'o'、最初からできるだけ多くの s が必要です。と照合する次の要素は であり'n'、これは と照合されないため'o'、最小限の照合を使用しようとしてもほとんど意味がありません。実際、通常のマッチングが失敗すると、失敗するまでにかなりの時間がかかります。バックトラックするものがなくなるまで、すべて'o'の をバックトラックする必要があります。この場合、実際には maximal matching を使用します/to*+n/。の'o'できる限りのことをして、決して返してはくれません。これにより、失敗したときにすぐに失敗するようになります。
'toooooon' ~~ /to*?n/
うーん
{t} マッチ [t]
[t] 一致 [o] 0 回
[t]<n> 一致しない [n] -> 再試行 [o]
[t]{o} [o] に 1 回一致
[t][o]<n> [n] の一致に失敗 -> 再試行 [o]
[t][o]{o} [o] に 2 回一致
[t][o][o]<n> 一致しない [n] -> 再試行 [o]
. . . .
[t][o][o][o][o]{o} [o] に 5 回一致
[t][o][o][o][o][o]<n> 一致しない [n] -> 再試行 [o]
[t][o][o][o][o][o]{o} [o] に 6 回一致
[t][o][o][o][o][o][o]{n}一致[n]
(注: 最大 RE についても同様)
'toooooon' ~~ /to*n/
うーん
{t} マッチ [t]
[t]{o}{o}{o}{o}{o}{o} マッチ [o] 6 回
[t][o][o][o][o][o][o]{n}一致[n]
'toooooo' ~~ /to*?n/
あまりにも
. . . .
. . . .
[t][o][o][o][o]{o} [o] に 5 回一致
[t][o][o][o][o][o]<n> 一致しない [n] -> 再試行 [o]
[t][o][o][o][o][o]{o} [o] に 6 回一致
[t][o][o][o][o][o][o]<n> 一致しない [n] -> 再試行 [o]
[t][o][o][o][o][o][o]<o> 一致に失敗 [o] 7 回 -> 一致に失敗
'toooooo' ~~ /to*n/
あまりにも
{t} マッチ [t]
[t]{o}{o}{o}{o}{o}{o} マッチ [o] 6 回
[t][o][o][o][o][o][o]<n> 一致しない [n] -> 再試行 [o]
[t][o][o][o][o][o] [o] に 5 回一致
[t][o][o][o][o][o]<n> 一致しない [n] -> 再試行 [o]
. . . .
[t][o] [o] 1回一致
[t][o]<o> 一致しない [n] -> 再試行 [o]
[t] 一致 [o] 0 回
[t]<n> 一致に失敗 [n] -> 一致に失敗
'toooooo' ~~ /to*+n/
あまりにも
{t} マッチ [t]
[t]{o}{o}{o}{o}{o}{o} マッチ [o] 6 回
[t][o][o][o][o][o][o]<n> 一致に失敗 [n] -> 一致に失敗
検索している文字列 (いわば干し草の山) には、部分文字列 "ton" が含まれていません。
ただし、部分文字列「toooooooooon」が含まれています。