根据关键获取价值

时间:2012-09-26 12:17:29

标签: java regex

我错了什么?当我设置变量param =“MOON”时,我需要得到333#444但我得到:333#444:JUPITER = 555。所以我一次只需要一个值。

final String parameters = "WORLD=111#222:MOON=333#444:JUPITER=555:SATURN=666:";
final String param = "MOON";

Pattern pattern = Pattern.compile("(.*)(" + param + ")=(.*)(:+)(.*)");
Matcher matcher = pattern.matcher(parameters);

if(matcher.matches()) {
    System.out.println("3: " + matcher.group(3)); // Value that I needed: 333#444
}

谢谢。

4 个答案:

答案 0 :(得分:1)

.*贪婪,所以它得到了尽可能多,而不是一点点。

尝试.*?[^:]*

答案 1 :(得分:1)

我不完全确定,但也许你想要的是提取所有key = value字段?如果是这种情况,您应该将字符串拆分为:字符并自行处理所有部分。然后将这些字符串部分与正则表达式([^=]+)=(.*)匹配,或者更好地,简单地将每个部分拆分为=字符。在这种情况下,您甚至不需要正则表达式,并可能节省程序执行时间!通过搜索MOON= ...很容易找到MOON表达式。

编辑:我做了以下旧的Java风格测试程序(最有可能得到改进):

class Test
{
        public static void main(String argv[])
        {
                String parameter="WORLD=111#222:MOON=333#444:JUPITER=555:SATURN=666";
                String[] elements=parameter.split(":");
                for (int i=0; i < elements.length; i++) {
                        String[] parts=elements[i].split("=", 2);
                        if ((parts.length == 2) && (parts[0].equals("MOON"))) {
                                System.out.println("MOON is "+parts[1]);
                        }
                }
        }
};

输出:

MOON is 333#444

在许多情况下,使用正则表达式是过度的,通常可以避免它,并节省执行时间。如果你有一个非常长的字符串,你可能只搜索MOON并从那里搜索下一个:或字符串结尾然后使用split,但在这种情况下我可能会使用正则表达式。这一切都取决于你是否还需要其他领域。

答案 2 :(得分:1)

如果你只是在333#444之后,那么这可行:

MOON=([0-9]+#[0-9]+)

这会让你MOON=333#444

(MOON=[0-9]+#[0-9]+)

但是不知道你明确的是什么,以及可能的值/格式可能是MOON的值,列表可以继续; - )

这:([A-Z]+?=[0-9]+(#[0-9]+)?)

会得到你:

WORLD=111#222 WORLD=111 #222

MOON=333#444 MOON=333 #444

JUPITER=555

SATURN=666

这就是这个:([A-Z]+?)=([0-9]+(#[0-9]+)?)

会得到你:

WORLD 111#222 #222

MOON 333#444 #444

JUPITER 555

SATURN 666

混合,匹配,冲洗,重复; - )

答案 3 :(得分:0)

我不确定性能,但它很容易阅读,看起来它有效: 更新2012-09-27:添加“或文本结束”... | $

final String parameter5 = "WORLD=111#222:MOON=333#444:JUPITER=555:SATURN=666:";           
final String P = "MOON";

Pattern pattern = Pattern.compile("(.*" + P + "=)(.*?)(:+.*|$)");
Matcher matcher = pattern.matcher(parameter5);

if (matcher.matches()) {
    System.out.println(matcher.group(2)); // 333#444
}