Java正则表达式不';虽然调试工具会匹配,但不匹配
我已经编写了一个正则表达式来解析该格式的字符串 对象名称KEY1=值KEY2=值 (由2个regexp实际完成) 这是我的utils类: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
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:你的答案是正确的。我冒昧添加了一个示例。如果你不同意,请回滚,我显然不会介意。