我有一个形式的字符串:
canonical_class_name[key1="value1",key2="value2",key3="value3",...]
目的是在一个组中捕获 canonical_class_name,然后交替 key=value 组。目前它不匹配测试字符串(在下面的程序中,testString
)。
必须至少有一个键/值对,但可能有很多这样的对。
问题:目前正则表达式正确地抓取了规范的类名和第一个键,但是它吞噬了所有内容,直到最后一个双引号,我如何让它变得懒惰地抓取键值对?
这是以下程序放在一起的正则表达式:
(\S+)\[\s*(\S+)\s*=\s*"(.*)"\s*(?:\s*,\s*(\S+)\s*=\s*"(.*)"\s*)*\]
根据您的喜好,您可能会发现程序版本更易于阅读。
如果我的程序传递了字符串:
org.myobject[key1=\"value1\", key2=\"value2\", key3=\"value3\"]
...这些是我得到的组:
Group1 contains: org.myobject<br/>
Group2 contains: key1<br/>
Group3 contains: value1", key2="value2", key3="value3<br/>
还有一点需要注意,使用String.split()
I 可以简化表达式,但我将其作为一种学习经验来更好地理解正则表达式,所以我不想使用这样的捷径。
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class BasicORMParser {
String regex =
"canonicalName\\[ map (?: , map )*\\]"
.replace("canonicalName", "(\\S+)")
.replace("map", "key = \"value\"")
.replace("key", "(\\S+)")
.replace("value", "(.*)")
.replace(" ", "\\s*");
List<String> getGroups(String ormString){
List<String> values = new ArrayList();
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(ormString);
if (matcher.matches() == false){
String msg = String.format("String failed regex validiation. Required: %s , found: %s", regex, ormString);
throw new RuntimeException(msg);
}
if(matcher.groupCount() < 2){
String msg = String.format("Did not find Class and at least one key value.");
throw new RuntimeException(msg);
}
for(int i = 1; i < matcher.groupCount(); i++){
values.add(matcher.group(i));
}
return values;
}
}