58

次の形式split()で区切られた文字列をトークン化するために使用しています。*

name*lastName*ID*school*age
%
name*lastName*ID*school*age
%
name*lastName*ID*school*age

このコードを使用して、「entrada.al」という名前のファイルからこれを読んでいます。

static void leer() {

    try {
        String ruta="entrada.al";
        File myFile = new File (ruta);
        FileReader fileReader = new FileReader(myFile);

        BufferedReader reader = new BufferedReader(fileReader);

        String line = null;

        while ((line=reader.readLine())!=null){
            if (!(line.equals("%"))){
                String [] separado = line.split("*"); //SPLIT CALL
                names.add(separado[0]);
                lastNames.add(separado[1]);
                ids.add(separado[2]);
                ages.add(separado[3]);
            }
        }

        reader.close();
    }

そして、私はこの例外を受けています:

スレッド「メイン」での例外 java.util.regex.PatternSyntaxException: メタ文字 '*' がインデックス 0 付近でぶら下がっています *

私の推測では*、元のテキスト ファイルにアフター エイジがないことが原因であると思われます。どうすれば回避できますか?

4

4 に答える 4

154

いいえ、問題は*正規表現の予約文字であるため、エスケープする必要があります。

String [] separado = line.split("\\*");

*「前の式の0個以上」を意味し(PatternJavadocを参照)、前の式を指定していなかったため、分割式が不正になりました。これがエラーがであった理由PatternSyntaxExceptionです。

于 2009-05-27T20:22:28.180 に答える
7

と同様の問題がありましregex = "?"た。正規表現で何らかの意味を持つすべての特殊文字で発生します。"\\"したがって、正規表現のプレフィックスとして持つ必要があります。

String [] separado = line.split("\\*");
于 2014-05-26T06:50:35.553 に答える
3

これは、* が前の文字の 1 つ以上の出現を示すメタ文字として使用されているためです。したがって、M* と書くと、ファイル MMMMMM..... が検索されます。ここでは * を唯一の文字として使用しているため、コンパイラは複数回出現する文字を探しているため、例外がスローされます。:)

于 2011-09-05T09:09:49.440 に答える