Java正则表达式不';虽然调试工具会匹配,但不匹配

Java正则表达式不';虽然调试工具会匹配,但不匹配,java,regex,Java,Regex,我已经编写了一个正则表达式来解析该格式的字符串 对象名称KEY1=值KEY2=值 (由2个regexp实际完成) 这是我的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 OB

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

对象名称KEY1=值KEY2=值

(由2个regexp实际完成)

这是我的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);
        }
    }
}
package de.hs.定居者.util;
导入java.util.HashMap;
导入java.util.regex.Matcher;
导入java.util.regex.Pattern;
公共类ParseUtils{
公共静态最终模式对象\u名称\u模式=
模式。编译(“^([A-Z0-9]+)([A-Z]+=.+)$”;
公共静态最终模式键\值\模式=
模式编译(“^([A-Z0-9]+)=([^=]+)([A-Z]+=.+)?$”;
公共静态ParseResult parseKeyValueLine(字符串行){
Matcher object=object\u NAME\u PATTERN.Matcher(line.trim());
字符串objectName=object.group(1);
HashMap数据=新的HashMap();
字符串VAL=object.group(2);
做{
匹配器匹配器=键值匹配器模式匹配器(VAL);
如果(!matcher.matches()){
打破
}
字符串键=matcher.group(1);
字符串值=matcher.group(2);
数据输入(键、值);
VAL=匹配组(3);
如果(VAL!=null){
VAL=VAL.trim();
}
}while(vals!=null);
返回新的ParseResult(objectName,data);
}
公共静态类解析结果{
私有字符串objectName;
私有HashMap数据;
公共ParseResult(字符串objectName、HashMap数据){
超级();
this.objectName=objectName;
这个数据=数据;
}
公共字符串getObjectName(){
返回objectName;
}
公共HashMap getData(){
返回数据;
}
公共字符串获取(字符串键){
返回getData().get(键);
}
}
}
我编写了一个测试,该测试使用“USER TEAM=TEAM a USER=tuxitux OTHER=bla”作为行参数来测试parseKeyValueLine方法,但执行失败,因为第一个表达式(OBJECT_NAME_模式中的表达式)显然不匹配

我遇到的问题是,当我将要测试它的表达式和字符串粘贴到regex调试器中时,它们都告诉我它匹配并给我正确的组。(使用和进行测试)

java处理正则表达式的方式有什么问题吗?

问题在于:

Matcher object = OBJECT_NAME_PATTERN.matcher(line.trim());
String objectName = object.group(1);
您创建了matcher,但没有告诉它对字符串进行实际操作。因此,即使有比赛,你也没有可用的小组

您需要调用其中一个匹配方法(
.find()
.lookingAt()
.matches()
),但这三个方法对您来说都是等效的,因为您的正则表达式都锚定在输入的开始和结束处),然后收集组

示例(
.find()
):

问题在于:

Matcher object = OBJECT_NAME_PATTERN.matcher(line.trim());
String objectName = object.group(1);
您创建了matcher,但没有告诉它对字符串进行实际操作。因此,即使有比赛,你也没有可用的小组

您需要调用其中一个匹配方法(
.find()
.lookingAt()
.matches()
),但这三个方法对您来说都是等效的,因为您的正则表达式都锚定在输入的开始和结束处),然后收集组

示例(
.find()
):


确保您没有任何手表表情。对我来说,是IDE watch表达式导致了问题。

确保没有任何watch表达式。对我来说,是IDE watch表达式导致了这个问题。

我在您的RE中看不到下划线pattern@fge哦,谢谢,就是这样。@Izzy下划线被([^=]+]匹配,意思是“一个或多个字符不是'=')。我在你的简历中看不到下划线pattern@fge哦,谢谢,成功了。@Izzy下划线与([^=]+),意思是“一个或多个字符不是“=”。+1:你的答案是正确的。我冒昧添加了一个示例。如果你不同意,请回滚,我显然不会介意。+1:你的答案是正确的。我冒昧添加了一个示例。如果你不同意,请回滚,我显然不会介意。