1

形式の文字列を解析する正規表現を作成しました

OBJECT_NAME KEY1=値 KEY2=値

(実際には 2 つの正規表現によって行われます)

これは私のユーティリティクラスです:

package de.hs.settlers.util;

import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ParseUtils {
    public static final Pattern OBJECT_NAME_PATTERN = 
            Pattern.compile("^([A-Z0-9 ]+) ([A-Z]+=.+)$");
    public static final Pattern KEY_VALUE_PATTERN = 
            Pattern.compile("^([A-Z0-9]+)=([^=]+)( [A-Z]+=.+)?$");

    public static ParseResult parseKeyValueLine(String line) {
        Matcher object = OBJECT_NAME_PATTERN.matcher(line.trim());
        String objectName = object.group(1);
        HashMap<String, String> data = new HashMap<String, String>();

        String vals = object.group(2);
        do {
            Matcher matcher = KEY_VALUE_PATTERN.matcher(vals);

            if (!matcher.matches()) {
                break;
            }

            String key = matcher.group(1);
            String value = matcher.group(2);
            data.put(key, value);
            vals = matcher.group(3);
            if (vals != null) {
                vals = vals.trim();
            }
        } while (vals != null);

        return new ParseResult(objectName, data);
    }

    public static class ParseResult {
        private String objectName;
        private HashMap<String, String> data;

        public ParseResult(String objectName, HashMap<String, String> data) {
            super();
            this.objectName = objectName;
            this.data = data;
        }

        public String getObjectName() {
            return objectName;
        }

        public HashMap<String, String> getData() {
            return data;
        }

        public String get(String key) {
            return getData().get(key);
        }
    }
}

行引数として「USER TEAM=Team A USER=tuxitux OTHER=bla」を使用してメソッド parseKeyValueLine をテストするテストを作成しましたが、最初の式 (OBJECT_NAME_PATTERN の式) が明らかに一致しなかったため、実行は失敗します。

私が抱えている問題は、式と文字列を貼り付けて正規表現デバッガーにテストすると、それらはすべて一致すると言って正しいグループを教えてくれることです。( http://gskinner.com/RegExr/およびhttp://www.debuggex.com/でテスト済み)。

Javaが正規表現を行う方法に問題はありますか?

4

2 に答える 2

6

問題はここにあります:

Matcher object = OBJECT_NAME_PATTERN.matcher(line.trim());
String objectName = object.group(1);

マッチャーを作成しましたが、文字列に対して実際に作業を行うように指示していません。その結果、一致があったとしても、使用可能なグループがありません。

一致するメソッドのいずれかを呼び出す必要があります ( .find().lookingAt()または.matches()、ただし、正規表現は入力の先頭と末尾の両方に固定されているため、3 つすべてが同等になります)、グループ収集します。

例 ( .find()):

Matcher object = OBJECT_NAME_PATTERN.matcher(line.trim());
object.find(); // or you could have an if statement here
String objectName = object.group(1);
于 2013-06-13T12:06:50.137 に答える