将这种字符串格式转换为对象的最佳方法是什么?
[Start successful - User:Berord; Name:Test; Fruits:Orange; Version:;]
我正在考虑将其与';'分开并执行substring(str.indexOf(“ User:”)+ 1),substring(str.indexOf(“ Name:”)+ 1)
还有其他更好的方法吗?
答案 0 :(得分:1)
如果用户数据始终采用FieldNameWithoutSpaces:DataWithOutSemicolon的形式;您可以将以下正则表达式与Pattern和Matcher一起使用:(\ S +):([^;] *);并从每个匹配项中提取组1和2。
示例:
private void OnTriggerEnter2D(Collider2D doorTrigger)
{
if (doorTrigger.gameObject.tag == "Player")
{
LoadLevel03 l3 = new LoadLevel03();
l3.openDoor = true;
}
}
这将导致以下输出。
Pattern p = Pattern.compile("(\\S+):([^;]*);");
Matcher m= p.matcher( "[Start successful - User:Berord; Name:Test; Fruits:Orange; Version:;]" );
while( m.find() ) {
String key = m.group( 1 );
String value = m.group( 2 );
//put those into a map or use in some other way, for demonstration I'll print them
System.out.println( key + "::" + value );
}
请注意,键不应该包含空格,而应以至少一个空格开头,否则,您将匹配更多内容,即,如果输入为User::Berord
Name::Test
Fruits::Orange
Version::
,则您将得到[Start successful-User:Berord;Name:Test;Fruits:Orange; Version:;]
和{{ 1}}。以同样的方式,您的值不应包含分号,否则匹配也会被弄乱。
如果您要求空格必须是可选的,并且值可以包含分号,则正则表达式可能会变得更加复杂(取决于要求),甚至根本不合适—在这种情况下,您需要使用(写)更专业的解析器。
答案 1 :(得分:1)
我将逐步分解此String
:
-
)分割此有趣的部分,以获取键值对;
分隔每个键值对,以分别获取键和值正如评论中已经提到的人一样,您可以使用:
存储键值对。
以下代码中进行了多项优化,例如Map<String, String>
,用于消除键和值中的前导和尾随空格,某些(可能已过时)检查映射中是否存在键,以及对拆分操作的结果进行一些检查。
这是一个示例解决方案,请阅读注释:
trim()
我从中得到的结果是
有一个键或值缺少相应的键或值:“ Version”(用冒号分割只能得到一个String!)
用户:Berord
版本:
名称:测试
水果:橙色
答案 2 :(得分:0)
分割为;首先,您将获得大小为3的字符串数组,可以对其进行循环并使用:
进行拆分 String s = "Start successful - User:Berord; Name:Test; Fruits:Orange; Version:;".replace("Start successful -","");
String splits[]=s.split(";");
for(String split:splits)
{
String splittedStrings[] =split.split(":");
String key = splittedStrings[0];
String value = splittedStrings[1];
}