まず、3つの使用法を要約しましょう。
call(charquence Target、charquenceの交換)を交換し、すべてのターゲットを置換に置き換えます。両方のパラメーターは文字列です。
amall(String Regex、String Replacement)の交換、すべての正規表現の一致を交換に置き換えます。正規表現は明らかに正規表現であり、交換は文字列です。
furned Perpectirst(String Regex、String falltement)は、基本的には置換と同じです。違いは、最初の一致のみが交換されることです。
次に、ソース文字列のAを /aに置き換えるための単純な要件があります。コードは次のとおりです。
system.out.println( "abac" .replace( "a"、 "// a")); ///ab/acsystem.out.println("abac".replaceall("a "、" // a ")); //abacsystem.out.println("abac".ReplaceFirst("a "、" // a ")); //abacsystem.out.println("abac".ReplaceFirst("a "、" // a ")); // abac結果は大きな驚きでした。長年の交代の後、私は少し混乱していました。
ソース文字列は「ABAC」であり、「A」を見つけ、 /aに置き換えます。 /はJavaエスケープキャラクターであるため、 /aを表現したい場合は、「// A」と書く必要があります。
3つの交換式で、最初の交換関数の結果のみが正しいです。何が問題ですか?
置き換えと置き換えは、最初のパラメーターが正規式であることを要求します。 「A」は、文字列Aと正規表現Aの両方として理解できるため、最初のパラメーターは問題ありません。
問題は2番目のパラメーターにあります。読者が交換機能のコメントを注意深く読むと、次の説明が見つかります。
交換用文字列のバックスラッシュ(/)およびドル記号($)は、結果が文字通りの交換用文字列として扱われている場合とは異なる場合があることに注意してください。 matcher.replaceallを参照してください。 java.util.regex.matcher.quotereplacementを使用して、必要に応じてこれらの文字の特別な意味を抑制します。
lateallとferpalfirstの最初のパラメーターは通常であるため、要件など、2番目のパラメーターでいくつかの小さなトリックを作成できます。ソース文字列のAを直後に文字に置き換えると、コードは次のとおりです。
system.out.println( "abac" .replaceall( "a(// w)"、 "$ 1 $ 1")); //bbccsystem.out.println("abac".replacefirst("a(//w) "、" $ 1 $ 1 ")); // BBAC規則性の意味は読者が理解できると仮定し、2番目のパラメーターでは、$シンボルを使用してグループの内容を取得できることがわかります。この例では、1ドルは最初のグループのコンテンツ、つまりaの直後のキャラクターを取得するために使用されます。
したがって、$シンボルは2番目のパラメーターに特別な意味を持ち、ランダムに書き込むとエラーが発生します。
system.out.println( "abac" .replaceall( "a(// w)"、 "$")); //スレッドの例外 "main" java.lang.stringindexOutofboundsexception:文字列索引外の範囲:1
$に置き換えたい場合はどうなりますか?これには、キャラクターを逃れる必要があります。
system.out.println( "abac" .replaceall( "a"、 "// $")); // $ b $ c
この時点で、読者は突然、バックスラッシュが2番目のパラメーターに特別な意味(脱出)を持っていることに気付くかもしれません。したがって、バックスラッシュを表現したい場合は、再び逃げなければなりません。
system.out.println( "abac" .replaceall( "a"、 "//// a")); ///ab/acsystem.out.println("abac".replacefirst( "a"、 "///// a")); /// ABAC簡単に理解するために、「//// a」のフロントバックスラッシュは、その後バックスラッシュを逃れ、その後のバックスラッシュは通常の文字列になります。このように、Javaメモリで見られる文字列は「// a」です。処理するとき、交換機能はフロントバックスラッシュを使用してバックスラッシュから逃げて、その後のバックスラッシュが$ $をエスケープするのに使用されず、メモリ内の最終文字列が「 /a」であることを表現し、Aを正常に /aに置き換えることができます。
要約します
脱出の問題は確かに絡み合っています。この記事を通じて、著者は、読者が将来これらの機能を使用するときに目を覚まし続けることができることを望んでおり、パラメーターの特殊文字に注意し、時間の爆弾を書くことを避けることを望んでいます。上記は、この記事のコンテンツ全体です。みんなの勉強や仕事に役立つことを願っています。ご質問がある場合は、メッセージを残してコミュニケーションをとることができます。