0

例として、次の情報を含むファイルがあります。

ユーザー: James 緯度: 1.0 経度: 2.0 日付: Mon Sep 16 22:15:48 CEST 2013

ユーザー: Romio 緯度: 11.0 経度: 2.0 日付: Mon Sep 16 22:15:48 CEST 2013

ユーザー: "Sander" 緯度: -1.0 経度: 28.0 日付: Mon Sep 16 22:15:48 CEST 2013

名前を取得したい: James、Romio、Sander、今のところ他には何もない。これどうやってするの?split メソッドと indexOf メソッドを使用してみましたが、使い方が間違っています。何度も削除した後、残っているコードの一部を次に示します。

public boolean uniqueUserName(String userName) {
    String[] currentName = null;
    String nameToValidate = null;

    int i = 0;

    try {
        while(reader.readLine() != null) {
            currentName = reader.readLine().split(":");             
            nameToValidate = currentName[i++];  

            if(nameToValidate.equals(userName)) {
                return false;
            }

            System.out.println("Names: " + nameToValidate);
        }

    } catch (IOException e) {
        e.printStackTrace();
    }       
    return true;
}

分割を使用すると名前が取得されず、NullPointer が取得されることはわかっています。おそらく、分割しやすくするために、ファイルにいくつかの追加の記号/式を導入する必要がありますか? 私はすべての提案に耳を傾けています。

ありがとう

4

1 に答える 1

1

次のように、正規表現を使用して、「User:」と「Latitude」の間の任意の単語文字を検索し、オプションの空白と二重引用符を受け入れることができます。

// input Strings
String james = "User: James Latitude: 1.0 Longitude: 2.0 Date: Mon Sep 16 22:15:48 CEST 2013";
String romio = "User: Romio Latitude: 11.0 Longitude: 2.0 Date: Mon Sep 16 22:15:48 CEST 2013";
String sander = "User: \"Sander\" Latitude: -1.0 Longitude: 28.0 Date: Mon Sep 16 22:15:48 CEST 2013";

// Pattern:                                group 
//                                          for
//                                         name
Pattern p = Pattern.compile("User:\\s+?\"?(\\w+?)\"?\\s+?Latitude");
// Matching...
Matcher m = p.matcher(james);
if (m.find()) {
// If found, referencing group 1 and printing it
    System.out.println(m.group(1));
}
// Etc...
m = p.matcher(romio);
if (m.find()) {
    System.out.println(m.group(1));
}
m = p.matcher(sander);
if (m.find()) {
    System.out.println(m.group(1));
}

出力:

James
Romio
Sander
于 2013-09-17T06:19:10.077 に答える