4

假设您正在处理按以下格式组织的数据:

[123]="some string" [234]=999999999 [345]="some other string"

在 Java 中,通过 KV 组合拆分每个最简单的方法是什么,其中 K 是标签(包含在 中[ ])。

是否有您知道的 Utils(Apache 或其他?)方法可以让您定义如上所示的结构以帮助迭代它,而不必手动计算和读取过去和之间的数据 [ ]

我们知道什么?

  • 每个元素都有一个标签
  • 每个标签将被包围[ ]
  • 标签和分配给标签的值将由=
  • 价值将在那里。不允许有空值。
  • 值可能会或可能不会被引号包围
4

4 回答 4

4

使用Pattern带有正则表达式"\\[(.*?)\\]=(.*?)( (?=\\[)|$)"的一次抓取对。
唯一的限制是假设下一个术语以空格开头,后跟 a [,因此该字符序列可能不会出现在值中。

此代码演示:

public static void main(String[] args) {
    String input = "[123]=\"some string\" [234]=999999999 [345]=\"some other string\"";
    Pattern pattern = Pattern.compile("\\[(.*?)\\]=(.*?)( (?=\\[)|$)");
    Matcher matcher = pattern.matcher(input);
    while (matcher.find()) {
        String k = matcher.group(1);
        String v = matcher.group(2);
        System.out.println(k + "-->" + v);
    }
}

输出:

123-->"some string"
234-->999999999
345-->"some other string"
于 2012-05-13T15:06:35.550 回答
1

听起来像是一份工作java.util.Scanner

于 2012-05-13T14:57:05.993 回答
1

你可以java.util.Properties用来读取数据。毕竟,他们只是一key=value对。

例如:

String input="[123]=\"some string\" [234]=999999999 [345]=\"some other string\"";
input = input.replaceAll("\\s+\\[", System.getProperty("line.separator") + "[");

Reader in = new StringReader(input);
Properties props = new Properties();
props.load(in);
in.close();

要提取数据,请使用以下命令:

private static String getValue(String key, Properties props) {
    return props.getProperty("[" + key + "]");
}

结果如预期:

System.out.println(getValue("123", props));
> "some string"

System.out.println(getValue("234", props));
> 999999999

System.out.println(getValue("345", props));
> "some other string"
于 2012-05-13T14:58:47.363 回答
0

我会使用 string.split(" ") 来获取所有键值对,然后使用 string.replaceFirst() 在每个项目中解析两次(一次获取键,一次获取值)。

我认为这不是最有效的方法,但在打字方面很容易。

于 2012-05-13T14:58:37.833 回答