[英]What would be the regex for this pattern?
在某些情况下,我的Java程序会收到一个包含几个键值属性的字符串,例如以下示例:
param1=value Param2=values can have spaces PARAM3=values cant have equal characters
参数的名称/键由一个单词(az,AZ,_和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=.*
为止。 (单词后跟等号,后跟)
我该怎么写这个正则表达式? 或使用正则表达式解决该问题的另一种解决方案是什么?
您可以在此处使用否定前瞻 。
(\\w+)=((?:(?!\\s*\\w+=).)*)
密钥位于捕获组#1
,值位于捕获组#2
。 请注意,我在环顾四周使用了\\s
,以防止该值具有尾随空格。
几种中的一种:
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=]+)
捕获不是空格或等于Group 1的所有字符 =
匹配文字=
([^\\\\s=]+)
捕获不是空格或等于Group 2的所有字符 您的正则表达式将是
(\\w+=(?:(?!\\w+=).)*)
它捕获到下一个param=
的param=value
对。 它将三个param=value
对捕获为三个独立的组。
说明:
\\\\w+=
匹配一个或多个单词字符,后跟=
符号。 (?:(?!\\\\w+=).)*
使用非捕获组和负数超前字符来匹配任何非\\w+=
格式的字符。 因此它捕获了下一个param=
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.