背景問題
次のJavaは、プリントアウトされます何の実施後、正確に言うことができますか?
System.out.println( 文字列。クラス .getName()+ "の.class" ); System.out.println( 。文字列クラス。.getName() でReplaceAll( "/ ")+" .classファイル""。");
私は最初の行のために、ほとんどの人がミスをしていないと信じて、印刷
java.lang.Stringで。クラス
私たちは、結果の印刷を楽しみにして、クラスのパッケージを分割する/使用します
Javaの/ LANG /文字列/ クラス
実質リターンの結果は、このようなものです:
//////////////// の.class
なぜこれがそうです
問題があるということString.replaceAllは、その最初の引数として正規表現を受け、
文字のリテラル配列の非受諾。(正規表現はJavaプラットフォーム1.4に追加されました
バージョン。)正規表現。「」、したがって、各クラスの名前を任意の1文字に一致し、かつ
文字はスラッシュに置き換え、そして私たちが見る出力を生成しています。
ソリューション
方法1:エスケープ文字を使用します
System.out.println( 文字列。クラス.getName() でReplaceAll( "/")+ ".classファイル" "\\。");
印刷結果
Javaの/ LANG / String.class
それは少しは理解していないではない、なぜ二人はあるのですか?
最初の「\」は、参照(引用正規表現)と、第2のコードを表す「\」エスケープ
引用
\何もするが、以下の文字引用
\ Q何もしますが、\ Eまでのすべての文字を引用します
\ E何もないが、\ Qによって開始された引用は終了
見積を使用する2番目の方法
System.out.println( 文字列。クラス.getName()。 でReplaceAll( "\\ Q \\ E。"、 "/")+ "の.class");
結果は
Javaの/ LANG / String.class
また、使用することができます
System.out.println( 文字列。クラス.getName() でReplaceAll(Pattern.quote( )、"/ ")+" .classファイル""。");
その内部実装は引用符を使用することです
/ ** *指定のリテラルパターンの<code>文字列</ code>を返します * <コード>文字列</ code>を。 * * <p>この方法は、するために使用することができ、<コード>列</ code>を生成する * <コード>パターン</ code>を作成した文字列と一致するであろう * <コード> S </コード>それあたかもリテラルのパターンだった。</ P>メタキャラクタ *またはエスケープシーケンスが入力シーケンスには、特別な与えられない *意味を。 * * @param S literalizedする文字列 * @return リテラル文字列置換 * @since 1。 slashEIndex = s.indexOf( "\\ E" )。 もし(slashEIndex == -1 ) リターン "\\ Q" + S + "\\ E" 。 StringBuilderのSB = 新しい StringBuilderの(s.length()* 2 )。 sb.append( "\\ Q" ); slashEIndex = 0 ; int型 = 0現在。 一方、(!(slashEIndex = s.indexOf( "\\ E"、現在))= -1 ){ sb.append(s.substring(現在、slashEIndex))。 電流 = slashEIndex + 2 。 sb.append( "\\ E \\\\ E \\ Q" ); } sb.append(s.substring(現在、s.length()))。 sb.append( "\\ E"返すsb.toStringを(); }
一般的な特殊文字は以下のとおりです。
EscapeSequenceに:
\ bの(バックスペースBS、ユニコード\\ u0008)
\ T(水平タブHT、ユニコード\\ u0009)
\ n(改行LF、ユニコード\\ u000a)
\ F(フォームフィードFF、ユニコード\\ u000c)
\ R (キャリッジリターンCR、ユニコード\\ u000d)
\ "(二重引用符"、ユニコード\\ u0022)
\ '(一重引用符'、ユニコード\\ u0027)
\ \(バックスラッシュ\、ユニコード\\ u005c)
OctalEscape(8進数値、 u00ffを\\するユニコード\\ U0000)
さらに
ASCII文字から形成された十二個のトークンは、セパレータ(区切り子)です。
(){} []。、。... @ ::
また、以下の方法を用いて決定することができます
輸入java.util.regex.Matcher; 輸入java.util.regex.Patternの。 パブリック クラスCheckSpecialCharacterString { / ** *文字列の各文字は特殊文字であるかどうかを確認するかのJavaを使用していない * @author www.instanceofjava.com * / パブリック 静的な 無効メイン(文字列[] args)を{ 文字列のStr = "JavaのStringインタビューを質問* $%」を、 文字列のspecialCharacters =」!?#$%& '()* +、 - / :; <=> @ [] ^ _ `{|}」。 以下のために(int型 i = 0; iは++; iがStr.length()< ){ 場合を(specialCharacters.contains(Character.toString(Str.charAt(I)))) { System.out.printlnは(Str.charAt(I) + ":特殊文字が" )。 } } } }
より詳細な情報は、公式ドキュメントを参照することができます[3]
参考文献:
[1]のJava疑問
【2】https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html
【3】https://docs.oracle.com/javase/specs/jls/se12/html/jls-3.html#jls-3.10.6
【4】http://www.instanceofjava.com/2017/05/how-to-check-if-character-is-special.html