虽然调试工具没有匹配,但Java Regex也不匹配

nar*_*tux 0 java regex

我编写了一个正则表达式来解析格式的字符串

OBJECT_NAME KEY1 =值KEY2 =值

(实际上由2个正则表达式完成)

这是我的utils类:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我编写了一个测试方法,用"USER TEAM = Team A USER = tuxitux OTHER = bla"作为行参数测试方法parseKeyValueLine,但执行失败,因为第一个表达式(OBJECT_NAME_PATTERN中的表达式)显然不匹配.

我遇到的问题是,当我粘贴表达式和字符串以使用正则表达式调试器测试它时,它们都告诉我它匹配并给我正确的组.(使用http://gskinner.com/RegExr/http://www.debuggex.com/进行测试).

java如何处理正则表达式有什么问题吗?

fge*_*fge 6

问题出在这里:

Matcher object = OBJECT_NAME_PATTERN.matcher(line.trim());
String objectName = object.group(1);
Run Code Online (Sandbox Code Playgroud)

您创建了匹配器,但是您没有告诉它实际上对字符串执行其工作.因此,即使有匹配,您也没有可用的组.

你需要调用的匹配方法之一(.find(),.lookingAt().matches(),但所有这三个将等同于你,因为你的正则表达式的开头和输入端锚固两者),然后收集组.

示例(.find()):

Matcher object = OBJECT_NAME_PATTERN.matcher(line.trim());
object.find(); // or you could have an if statement here
String objectName = object.group(1);
Run Code Online (Sandbox Code Playgroud)