这种模式的正则表达式是什么?

时间:2014-07-02 02:16:30

标签: java regex string

我的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=.*。 (单词后跟等号和后面的内容)

我怎么能写这个正则表达式?或者使用正则表达式解决问题的另一种方法是什么?

3 个答案:

答案 0 :(得分:4)

您可以在此处使用否定前瞻

(\\w+)=((?:(?!\\s*\\w+=).)*)

密钥位于捕获组#1内,值位于捕获组#2中。请注意,我在环视中使用\s以防止值具有尾随空格。

Live Demo

答案 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+=).)*)

DEMO

它捕获param=value对到下一个param=。它将三个param=value对捕获到三个不同的组中。

说明:

  • \\w+=匹配一个或多个单词字符,后跟=符号。
  • (?:(?!\\w+=).)*非捕获组和否定前瞻用于匹配此\w+=格式中不属于字符的任何字符。因此它会捕获到下一个param=