Javaはほとんど当てにならない特殊文字であります

背景問題

次のJavaは、プリントアウトされます何の実施後、正確に言うことができますか?

        System.out.println(
                文字列。クラス .getName()+ "の.class" ); 
        System.out.println( 文字列クラス。.getName()
                でReplaceAll( "/ ")+" .classファイル""。");

私は最初の行のために、ほとんどの人がミスをしていないと信じて、印刷

java.lang.Stringで。クラス

私たちは、結果の印刷を楽しみにして、クラスのパッケージを分割する/使用します

Javaの/ LANG /文字列/ クラス

実質リターンの結果は、このようなものです:

//////////////// の.class

なぜこれがそうです

Javaはほとんど当てにならない特殊文字であります

 理由

  問題があるということ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

おすすめ

転載: www.cnblogs.com/davidwang456/p/11511209.html