1

私は最近 Java の一部を学んでいましたがregex、今日は境界の使用に関する問題に遭遇しました\\G。私のコードは次のとおりです。

  String input = "abcdec";
  System.out.println(String.format("Before :'%s' ; after replace : '%s'", input , input.replaceAll("\\Gx?", "!")));

を印刷している間Before :'abcdec' ; after replace : '!abcdec'、なぜこれを印刷するのかわかりません。文字列の先頭と最初に一致した後、場所を文字 '!' に置き換えます。、しかし、なぜ再び一致できないのでしょうか?正規表現 '\Gx?' だと思います。あらゆる場所にマッチします。

私はあなたの助けが必要です, それぞれの助けは大歓迎です!ありがとう..

4

2 に答える 2

0

ここから引用します:If you wish one search to pick up where the last one left off you can use the "\G" pattern element. これは、検索が実行されていない場合、\G は単に文字列の先頭から検索を開始し、最初の一致で停止するように指示することを意味します。

別のを次に示します。最初の置換では開始位置が 0 から移動しなかったため、再び感嘆符が文字列の先頭に追加されることに注意してください。

プログラムに何を期待していましたか?

于 2012-07-26T07:39:24.207 に答える
0

編集:わかりました。間違った仮定を削除しました。


何が起こるか:

  1. replaceAll入力の先頭から開始 (index 0)
  2. \G初期開始値に一致します0
  3. x見つかりませんでした - 大丈夫です、条件付きです
  4. 最後に到達します。0からまでの最初のマッチに成功しました0!
  5. !出力に置換を追加します
  6. 次の反復、さらに 1 文字 (index 1)から開始
  7. 最後の試合の結末は0. 、位置に\G適用され、一致しません!1
  8. ...文字列全体をステップ実行すると、一致することはありません。
  9. 出力文字列を返します:!abc...

Regex Boundary Matchers Java Tuturialの最後の例を読むと、より明確になりました。

于 2012-07-26T07:51:09.537 に答える