迭代模式

时间:2012-05-13 14:46:51

标签: java

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

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

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

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

我们知道什么?

  • 每个元素都有一个标记
  • 每个代码都会被[ ]
  • 包围
  • 分配给代码的代码和值将由=
  • 分隔
  • 价值就在那里。不允许空值。
  • 值可能会也可能不会被引号括起来

4 个答案:

答案 0 :(得分:4)

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

此代码演示:

[

输出:

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);
    }
}

答案 1 :(得分:1)

听起来像是java.util.Scanner的工作。

答案 2 :(得分: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"

答案 3 :(得分:0)

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

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