我正在开发一个应用程序。用户将在服务器中输入一些设置值。当我通过内置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"
我正在寻找一个正则表达式来分割这些字符串;
答案 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));
}
}
但是,有一些考虑因素:
正则表达式的作用:
(\\w+)
- 这会查找一行中的一个或多个单词字符(A-z_)并将它们放入&#34;捕获组&#34; (group(1)
)=
- 文字等于(?:...)?
- 这使得分组不是捕获组(不会是.group(n)
,而尾随?
会使其成为可选分组。\\{(.*?)\\}
- 这会在文字{
和}
之间查找任何内容(注意:如果存在迷路}
,则会中断)。如果此部分存在,{}
之间的内容将位于第二个&#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} }}。