我错了什么?当我设置变量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
}
谢谢。
答案 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
}