10

そこで、文字列内に保持されている個々のコンポーネントを解析およびソートするためにsplitメソッドを使用する私のプログラムでコードの小さなセクションを作成しました。以下はコードのサンプルです。

String[] sArray;

String delimiter = "*";

String test = "TEXT*TEXT*TEXT*";
String a = "";
String b = "";
String c = "";

sArray= test.split(delimiter);

a = sArray[0];
b = sArray[1];
c = sArray[2];

System.out.println("A is: " + a + "\nB is: " + b + "\nC is: " + c);

ただし、このプログラムを実行すると、次のようなエラーが返されます。

Dangling meta character '*' near index 0

そこで、このエラーをグーグルで検索したところ*、正規表現でワイルドカード文字と見なす方法の問題に関連している可能性があることがわかりました。だから私は試しました:

String delimiter = "\*"

しかし、それは次のような別のエラーを返しました。

illegal escape character

誰かが以前にこの問題に遭遇したことがありますか、またはあなたが*Javaで脱出することになっている方法を知っていますか?

4

3 に答える 3

25

バックスラッシュもエスケープする必要があります。

String delimiter = "\\*";

文字列リテラル"\\"は単一のバックスラッシュであるため、文字列リテラル"\\*"はエスケープされたアスタリスクを表します。

于 2013-01-07T22:51:25.947 に答える
5

解決策を理解する方法は、ここで 2 つの「言語」が関係していることを理解することです。リテラルを表すために*a でエスケープする必要があるメタ文字である正規表現 (Java フレーバー) の言語があります。それはあなたを与える\*

''\*''    // not Java yet ...

\しかし、aがエスケープ文字である Java 文字列リテラルの「言語」でその文字列を表現しようとしています。そのため、リテラル\(表現しようとしているものが何であれ) をエスケープする必要があります。これにより、

"\\*"     // now Java ...

このアプローチ/考え方を一貫して適用すると、「最初に正規表現のエスケープを行い、次に文字列リテラルのエスケープを行う」-混乱することはありません。

于 2013-01-07T23:03:22.750 に答える
-1

Java で "\" を表現するには、その前にもう 1 つ "\" を使用する必要があるため、"*" の前に "\" を付ける必要があります。

したがって、"\" は次を表します:-----> "\" したがって、" " を区切り文字として使用する場合は、"\ "を使用します。

修正されたコード:

String delimiter = "\\*";
String test = "TEXT*TEXT*TEXT*";
String a = "";
String b = "";
String c = "";
sArray= test.split(delimiter);
a = sArray[0];
b = sArray[1];
c = sArray[2];
System.out.println("A is: " + a + "\nB is: " + b + "\nC is: " + c);

出力:

A: テキスト

B: テキスト

C は: テキスト

于 2015-06-19T17:21:24.413 に答える