我编写了一个正则表达式来解析格式
的字符串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);
}
}
}
我编写了一个测试方法,用“USER TEAM = Team A USER = tuxitux OTHER = bla”作为行参数测试方法parseKeyValueLine,但执行失败,因为第一个表达式(OBJECT_NAME_PATTERN中的表达式)显然没有'匹配。
我遇到的问题是,当我粘贴表达式和字符串以使用正则表达式调试器进行测试时,它们都会告诉我匹配并给我正确的组。 (使用http://gskinner.com/RegExr/和http://www.debuggex.com/进行测试。)
java如何处理正则表达式有什么问题吗?
答案 0 :(得分:6)
问题在于:
Matcher object = OBJECT_NAME_PATTERN.matcher(line.trim());
String objectName = object.group(1);
您创建了匹配器,但您没有告诉它实际对字符串执行其工作。因此,即使有匹配,您也没有可用的组。
您需要调用其中一种匹配方法(.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);
答案 1 :(得分:0)
确保没有任何监视表达式。对我而言,导致问题的是IDE监视表达式。