その間
"a".replaceAll("a", "b")
"a".replaceAll("a+", "b")
"a".replaceAll("a+?", "b")
すべてが戻ってきますb
、なぜですか
"a".replaceAll("a*", "b")
戻っbb
て
"a".replaceAll("a*?", "b")
戻るbab
?
"a".replaceAll("a*", "b")
最初にに置き換えa
、b
次にポインタを。を超えて進めますb
。次に、文字列の終わりと一致し、。に置き換えられb
ます。空の文字列と一致したため、ポインタを進め、文字列から外れて終了し、結果としてbb
。
"a".replaceAll("a*?", "b")
最初に文字列の先頭に一致し、。に置き換えられb
ます。inは「欲張りでない」(可能な限り一致しない)を意味するa
ため、一致しません。空の文字列と一致したため、をスキップしてポインタを進めます。次に、文字列の終わりに一致し、文字列に置き換えられて文字列から外れ、結果として。最終結果は、実行した場合と同じです。?
a*?
a
b
bab
"a".replaceAll("", "b")
これは、幅がゼロの一致が原因で発生します。
"a".replaceAll("a*", "b")
2回一致します:
*
を消費しa
ます。文字列の次の位置(現在は文字列の最後)に進み、そこで一致を試みます。空の文字列が一致します。
" a "
\| \___ 2. match empty string
\_____ 1. match "a"
"a".replaceAll("a*?", "b")
また、2回一致します:
*?
を消費せずに空の文字列と一致しますa
。文字列の次の位置(現在は文字列の最後)に進み、そこで一致を試みます。空の文字列が一致します。
" a "
\ \___ 2. match empty string
\_____ 1. match empty string
の"a".replaceAll("a*", "b")
*-0以上の場合はここ`a*`
1. a - replaced by b
2. * - is also true as empty string is true for *,so, replaced by b
とで"a".replaceAll("a*?", "b")
1. *? - makes anything non-greedy means it makes regrex to match as little
as possible,
2. so,the pre and post empty string would be replaced by "b" and
as a*? is non-greedy, it will not replace it