1

私は正規表現が得意ではなかったので、これを取得できないようです...

これらの行に沿ってステートメントを一致させようとしています (これらは、私が読んでいるテキスト ファイルの 2 行です)

Lname Fname 12.35 1
Jones Bananaman 7.1 3

現在、これをwhile文に使用しています

reader.hasNext("\\w+ \\w+ \\d*\\.\\d{1,2} [0-5]")

ただし、while 文には入りません。while を削除すると、プログラムはテキスト ファイルを正常に読み取ります。コード セグメントは次のとおりです。

private void initializeFileData(){
    try {
        Scanner reader = new Scanner(openedPath);

        while(reader.hasNext("\\w+ \\w+ \\d*\\.\\d{1,2} [0-5]")){
            employeeInfo.add(new EmployeeFile(reader.next(), reader.next(), reader.nextDouble(), reader.nextInt(), new employeeRemove()));
        }
        for(EmployeeFile element: employeeInfo){
            output.add(element);
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}
4

4 に答える 4

6

\s単語間のスペースには文字クラスを使用します。

while(reader.hasNext("\\w+\\s\\w+\\s\\d*\\.\\d{1,2}\\s[0-5]"))

アップデート:

クラスの javadoc によると、Scannerデフォルトでは、空白を使用してトークンを分割します。useDelimiter(String pattern)の方法で使用する区切り文字を変更できますScanner

private void initializeFileData(){
    try {
        Scanner reader = new Scanner(openedPath).useDelimiter("\\n");
        ...
        while(reader.hasNext("\\w+\\s\\w+\\s\\d*\\.\\d{1,2}\\s[0-5]")){
        ...

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html

于 2012-06-12T17:36:44.473 に答える
2

私が見ることができるものから(正規表現は常に私の脳をだますように見えるので、間違っている場合は修正してください:p)、スペースを正しく処理していません。標準の「 」文字だけでなく、\s を使用する必要があります

編集: すみません、\s。他の誰かが私を打ち負かしました:p

于 2012-06-12T17:37:53.627 に答える
0

実際

\w+

をキャッチしようとし[Lname, Fname, 12, 35, 1]ていLname Fname 12.35 1ます。reader.nextLine()したがって、そこからすべての正規表現の一致を保存してから抽出することができます。そこから、たとえば次のように少し抽象化できます。

class EmployeeFile {

 .....

     public EmployeeFile(String firstName, String lastName,
                         Double firstDouble, int firstInt,
                         EmployeeRemove er){
          .....
     }

     public EmployeeFile(String line) {
        //TODO : extract all the required info from the string array
        //       instead of doing it while reading at the same time. 
        //       Keep input parsing separate from input reading.
        //       Turn this into a string array using the regex pattern 
        //       mentioned above

     }



}
于 2012-06-12T17:59:32.400 に答える
0

ファイルと最後のループなしで、次のような独自のバージョンを作成しました。

private static void initializeFileData() {
        String[] testStrings = {"Lname Fname 12.35 1", "Jones Bananaman 7.1 3"};
        Pattern myPattern = Pattern.compile("(\\w+)\\s+(\\w+)\\s+(\\d*\\.\\d{1,2})\\s+([0-5])");
        for (String s : testStrings) {
            Matcher myMatcher = myPattern.matcher(s);
            if (myMatcher.groupCount() == 4) {
                String lastName = myMatcher.group(1);
                String firstName = myMatcher.group(2);
                double firstValue = Double.parseDouble(myMatcher.group(3) );
                int secondValue = Integer.parseInt(myMatcher.group(4));                
                //employeeInfo.add(new EmployeeFile(lastName, firstName, firstValue, secondValue, new employeeRemove()));
            }
        }
    }

グループを作成するために、ドットの前のスラッシュを削除し (任意の文字ではなくドットが必要です)、括弧を挿入したことに注意してください。

お役に立てば幸いです。

于 2012-06-12T18:07:07.037 に答える