在Java中解析此字符串的最佳方法是什么?

3
我有一个字符串的形式是:
{'var1':var2}

我能够解析这个字符串,以便var1和var2都是字符串变量。但是需要多次使用字符串分词器调用,首先从“:”分割,然后提取数据。
那么最好的方法是什么(代码最少)?

花括号是字符串的一部分吗?Var one在逗号中,而var2不在?您是否使用过Apache Commons或Google Guava? - Shahzeb
看起来非常类似于JSON... - Mike McMahon
1
@MikeMcMahon:JSON在所有字符串周围使用双引号。 - Mark Byers
“最好的方法(代码行数最少)是什么?”目前需要多少行代码?这是否包括“空白”行? - Andrew Thompson
1
@MarkByers 因此有点诡异的评论 :) - Mike McMahon
显示剩余6条评论
5个回答

4

如果你只想要一个包含两个值的数组,那么你可以通过提取子字符串并在“:”上分割来完成它。代码大概是这样的:

s = s.substring(2, s.length()-1);
String[] sarr = s.split("':");

如果你真的只想要一行代码,你可以将它们组合成以下形式:
String[] sarr = s.substring(2, s.length()-1).split("':");

2

这应该可以工作:

String yourstring = "{'var1':var2}";
String regex = "\\{'(.+)':(.+)}";
Matcher m = Pattern.compile(regex).matcher(yourstring);
String var1 = m.group(1);
String var2 = m.group(2);
编辑:针对评论者:

字符串:

{'this is':somestring':more stuff:for you}

输出:

var1 = this is':somestring
var2 = more stuff:for you

PS:使用Perl进行测试,目前没有Java可用,非常抱歉。

编辑:如user unknown所指出的那样,看起来Java正则表达式引擎不喜欢未转义的{。已进行转义。


1
这个问题存在 在 var1 或 var2 中 - 但我认为这些情况是无法解决的/不确定的。 - esej
更正:即使如此,它也能正常工作。如果未被告知,正则表达式会很贪婪,并且如果分号在单引号之间,则不会引起混淆。我认为第一个字符串甚至可以包含单引号(未经测试)。 - m0skit0
不,即使在var2上有分号,它也能正常工作。就像我说的,如果没有另外的指示,正则表达式会贪婪匹配。 - m0skit0
1
正则表达式无法解析/匹配任意嵌套和转义引号。需要使用真正的解析器来完成这项工作。如果正确构造,正则表达式对于引号内部的冒号问题是令人满意的,正如@m0skit0所指出的那样。 - Stephen P
1
我猜你必须掩盖开头的 {,否则它会被认为是一个无效的重复开始。 - user unknown
显示剩余5条评论

2
这在一般情况下无法解决。 例如考虑以下情况: 情况a) 变量1=
:':':

var2=

':'

完整的原始字符串将是

{':':':':':'}

情况b) 变量1=

:

var2=

':':':'

完整的原始字符串将会是

{':':':':':'}

所以,我们需要“更多信息”。根据您的要求/用例,您必须接受歧义,对字符串进行限制或转义/编码。

1

类似于(易碎-参见评论)

// 3 lines..
String[] parts = "{'var1':var2}  ".trim().split("':");
String var1 = parts[0].substring(2,parts[0].length);
String var2 = parts[1].substring(0,parts[1].length-1);

3
这是一个包含冒号和单引号的变量 var1 的字符串:'uninteresting'。 - esej

0

你可以使用正则表达式:

String re = "\\{'(.*)':(.*)}";
String var1 = s.replaceAll (re, "$1");
String var2 = s.replaceAll (re, "$2");

你需要对开头的{进行转义,否则会出现java.util.regex.PatternSyntaxException: Illegal repetition异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接