我的Java程序在某些时候会收到一个包含几个键值属性的字符串,如下例所示:
param1=value Param2=values can have spaces PARAM3=values cant have equal characters
参数的名称/键由一个单词(a-z,A-Z,_和0-9)组成,后跟一个=
字符(不用空格分隔)和它的值。该值是一个可以包含空格的文本,并持续到字符串的结尾或另一个参数的开头。 (这是一个单词后面跟着等于它的值,等等。)
我需要从此字符串中提取Properties
对象(字符串到字符串映射)。我试图使用正则表达式来查找每个键值集。代码是这样的:
public static String createProperties(String str) {
Properties prop = new Properties();
Matcher matcher = Pattern.compile(some regex).match(str);
while (matcher.find()) {
String match = matcher.group();
String param = ...; // What comes before '='
String value = ...; // What comes after '='
prop.setProperty(param, value);
}
return prop;
}
但是正则表达式写得不正常。
String regex = "(\\w+=.*)+";
由于.*
告诉正则表达式得到它发现的“任何东西”,它将匹配整个字符串。我想告诉正则表达式搜索,直到找到另一个\\w=.*
。 (单词后跟等号和后面的内容)
我怎么能写这个正则表达式?或者使用正则表达式解决问题的另一种方法是什么?
答案 0 :(得分:4)
答案 1 :(得分:1)
其中一种方式:
List<String> paramNames = new ArrayList<String>();
List<String> paramValues = new ArrayList<String>();
Pattern regex = Pattern.compile("([^\\s=]+)=([^\\s=]+)");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
paramNames.add(regexMatcher.group(1));
paramValues.add(regexMatcher.group(2));
}
正则表达式:
([^\\s=]+)=([^\\s=]+)
代码将密钥检索为组1,值为组2。
<强>解释强>
([^\\s=]+)
捕获任何不是空格或等于第1组的字符=
与文字=
([^\\s=]+)
捕获任何不是空格或等于第2组的字符答案 2 :(得分:1)
你的正则表达式是,
(\\w+=(?:(?!\\w+=).)*)
它捕获param=value
对到下一个param=
。它将三个param=value
对捕获到三个不同的组中。
说明:
\\w+=
匹配一个或多个单词字符,后跟=
符号。(?:(?!\\w+=).)*
非捕获组和否定前瞻用于匹配此\w+=
格式中不属于字符的任何字符。因此它会捕获到下一个param=