正则表达式匹配问题与以下方案

时间:2014-06-23 18:46:17

标签: java regex

我正在开发一个应用程序。用户将在服务器中输入一些设置值。当我通过内置API向服务器请求值时。我得到的价值就像整个字符串:
例如 -

name={abc};display={xyz};addressname={123}

这里的属性是名称,显示和地址,各自的值分别是abc,xyz和123 我曾经分裂过;作为第一个分界仪和=作为第二个分水计。

String[] propertyValues=iPropertiesStrings.split(";");
        for(int i=0;i<propertyValues.length;i++)
        {
            if(isNullEmpty(propertyValues[i]))
                continue;

            String[] propertyValue=propertyValues[i].split("=");
            if(propertyValue.length!=2)
                mPropertyValues.put(propertyValue[0], "");
            else
                mPropertyValues.put(propertyValue[0], propertyValue[1]);
        }
    }

这里的mPropertyValues是哈希映射,用于保存属性名称及其值。

问题是可以有字符串:

case 1:  name={abc};display={ xyz=deno; demo2=pol };addressname={123}
case 2:  name=;display={ xyz=deno; demo2=pol };addressname={123}

我希望hashmap填充:

案例1:

name ="abc" 
display = "xyz= demo; demo2 =pol"
addressname = "123"

案例2:

name =""
display = "xyz= demo; demo2 =pol"
addressname = "123"

我正在寻找一个正则表达式来分割这些字符串;

3 个答案:

答案 0 :(得分:0)

以下正则表达式应符合您的条件,并使用命名捕获组来获取您需要的三个值。

name=\{(?<name>[^}])\};display=\{(?<display>[^}]+)\};addressname=\{(?<address>[^}]\)}

答案 1 :(得分:0)

假设您的数据集可以更改,更好的解析器可能更具动态性,从该返回类型中找到的任何内容构建Map

这个正则表达式非常简单,考虑到你在上面列出的情况(并没有{}的嵌套,正如其他人提到的那样):

Matcher m = Pattern.compile("(\\w+)=(?:\\{(.*?)\\})?").matcher(source_string);
while (m.find()) {
    if (m.groupCount() > 1) {
        hashMap.put(m.group(1), m.group(2));
    }
}

但是,有一些考虑因素:

  1. 如果m.group(2)不存在,&#34; null&#34;将是值,(您可以通过少量逻辑将其调整为您想要的值)。
  2. 这将考虑不同的数据集 - 以防您将来的数据发生变化。
  3. 正则表达式的作用:

    1. (\\w+) - 这会查找一行中的一个或多个单词字符(A-z_)并将它们放入&#34;捕获组&#34; (group(1)
    2. = - 文字等于
    3. (?:...)? - 这使得分组不是捕获组(不会是.group(n),而尾随?会使其成为可选分组。
    4. \\{(.*?)\\} - 这会在文字{}之间查找任何内容(注意:如果存在迷路},则会中断)。如果此部分存在,{}之间的内容将位于第二个&#34;捕获组&#34; (.group(2))。

答案 2 :(得分:0)

假设不能嵌套{}这应该做你需要的事情

String data = "name=;display={ xyz=deno; demo2=pol };addressname={123}";

Pattern p = Pattern.compile("(?<name>\\w+)=(\\{(?<value>[^}]*)\\})?(;|$)");
Matcher m = p.matcher(data);

while (m.find()){
    System.out.println(m.group("name")+"->"+(m.group("value")==null?"":m.group("value").trim()));
}

输出:

name->
display->xyz=deno; demo2=pol
addressname->123

解释

(?<name>\\w+)=(\\{(?<value>[^}]*)\\})?(;|$)可以分成

部分
  • (?<name>\\w+)=代表XXXX =并将XXXX放置在名为name的群组中(属性)
  • (\\{(?<value>[^}]*)\\})?是可选的{XXXX}部分,其中X不能是}。此外,它会将XXXX部分放在名为value的组中。
  • (;|$)表示;或数据结尾(由$锚点表示),因为公式为name=value;,或者如果对位于数据末尾{{1} }}。