2011-05-31 188 views
2

从字符串[foo](bar)我想提取foobar部分:帮助,正则表达式

Pattern p = Pattern.compile("\\[(.*)\\]\\((.*)\\)"); 
String input = "[foo](bar)"; 
assert p.matcher(input).matches(); 
String[] a = ??? // should be initialized to {"foo", "bar"} 

我怎么在第四行写获得来自输入foobar

+0

您应该使用p.matcher(输入),返回你[匹配](http://download.oracle。 com/javase/7/docs/api/java/util/regex/Matcher.html)对象,其中包含您的匹配项。然后,您可以使用find()来查找字符串中的下一个字符串,并使用group()来访问最后找到的字符串。 – 2011-05-31 18:58:18

回答

4

这应该让你接近的地方,你想成为:

Pattern p = Pattern.compile("\\[(.*)\\]\\((.*)\\)"); 
String input = "[foo](bar)"; 
Matcher m = p.matcher(input); 
if (m.find()){ 
    String[] a = { m.group(1), m.group(2) }; 
} 

本质上讲,你将创建一个Matcher。然后使用find()找到匹配项。然后,您将使用这些组来查找在括号内匹配的内容。

+0

为什么正则表达式组数从1!?但是:+1 – 2011-05-31 19:02:40

+1

@Martijn,因为组0将持有整个比赛。 – 2011-05-31 19:03:31

0

我会说像下方的正则表达式是比较容易处理和扩展:

[\[\(](.*?)[\]\)] 
+0

但是这只是匹配字符串的一部分,它也匹配无效的部分,比如'(foo)' – 2011-05-31 19:30:22

+0

@Bart Kiers-我知道你是对的,但我仍然想说OP要求提取foo和bar。 – manojlds 2011-05-31 19:31:43