1

我有什么错?当我设置变量 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

4 回答 4

1

.*是贪婪的所以它得到尽可能多,而不是尽可能少。

尝试.*?[^:]*

于 2012-09-26T12:19:11.040 回答
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并从那里搜索下一个:或字符串结尾,然后使用拆分,但在这种情况下我可能会使用正则表达式。这完全取决于您是否还需要其他字段。

于 2012-09-26T12:22:01.143 回答
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

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

于 2012-09-26T12:26:07.343 回答
0

我不确定性能,但它很容易阅读,而且看起来很有效:更新 2012-09-27: added "or end of text" ... |$

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
}
于 2012-09-26T12:46:13.320 回答