18

重複の可能性:
正規表現の貪欲な数量詞を使用したString.replaceAll()の異常正規表現の
奇妙な動作

その間

"a".replaceAll("a", "b")
"a".replaceAll("a+", "b")
"a".replaceAll("a+?", "b")

すべてが戻ってきますb、なぜですか

"a".replaceAll("a*", "b")

戻っbb

"a".replaceAll("a*?", "b")

戻るbab

4

3 に答える 3

22
"a".replaceAll("a*", "b")

最初にに置き換えab次にポインタを。を超えて進めますb。次に、文字列の終わりと一致し、。に置き換えられbます。空の文字列と一致したため、ポインタを進め、文字列から外れて終了し、結果としてbb

"a".replaceAll("a*?", "b")

最初に文字列の先頭に一致し、。に置き換えられbます。inは「欲張りでない」(可能な限り一致しない)を意味するaため、一致しません。空の文字列と一致したため、をスキップしてポインタを進めます。次に、文字列の終わりに一致し、文字列に置き換えられて文字列から外れ、結果として。最終結果は、実行した場合と同じです。?a*?abbab"a".replaceAll("", "b")

于 2013-02-04T17:23:39.320 に答える
5

これは、幅がゼロの一致が原因で発生します。


"a".replaceAll("a*", "b")

2回一致します:

  1. 文字列の先頭で一致を試してください。貪欲は一致として*を消費しaます。
  2. 文字列の次の位置(現在は文字列の最後)に進み、そこで一致を試みます。空の文字列が一致します。

    " a "
     \| \___ 2. match empty string
      \_____ 1. match "a"
    


"a".replaceAll("a*?", "b")

また、2回一致します:

  1. 文字列の先頭で一致を試してください。欲張りでないものは、*?を消費せずに空の文字列と一致しますa
  2. 文字列の次の位置(現在は文字列の最後)に進み、そこで一致を試みます。空の文字列が一致します。

    " a "
     \  \___ 2. match empty string
      \_____ 1. match empty string
    
于 2013-02-04T17:25:08.993 に答える
1

"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 
于 2013-02-04T17:26:54.357 に答える