2009-11-17 122 views
1
String text = "[! hello ¡world ¡] otra cosa ¡]"; 
String pt = "\\[!(.*)¡\\]"; 
Matcher mc = Pattern.compile(pt).matcher(text); 
while(mc.find()){ 
    System.out.println(mc.group(1)); 
} 

此代码打印hello ¡world ¡] otra cosa在java中匹配正则表达式

什么样的模式只能匹配hello ¡world

我没有找到的是一种否定字面字符串而不是字符的方法。例如:([^(¡\])]*)

问题是:
如何匹配所有不是文字字符串的东西?

+0

你会发现这个链接方便的与Java播放时正则表达式:http://www.regexplanet.com/simple/index.html – hexium 2009-11-17 21:18:42

回答

8

只需添加一个?*

String pt = "\\[!(.*?)¡\\]"; 
4

后,您需要一个害羞不愿意非贪婪)的表达。

请参阅documentation for the java.util.regex.Pattern class了解Greedy Quantifier语法。在你的情况下,你希望你的Kleene星匹配最短的字符串可能。正常的行为是贪婪的:它匹配尽可能长的字符串。

0

另一种匹配字符串的方法是使用否定,这样就可以避免。*?这可能会导致不良结果和性能下降。

String pt = "\[!([^]]*)¡\]"; 

,直到找到支架,只有原路返回一次匹配¡该版本将匹配一切。

+0

我假设佛朗哥希望'''与'.'匹配,如果它没有在''之前。 – 2009-11-17 21:06:23

1

要回答你的直接问题,只匹配.的方式,当它不是字符串¡]是使用负前瞻的一部分:

String pt = "\\[!((?:(?!¡\\]).)*)¡\\]"; 
+0

这是我正在寻找,匹配。例如,这不是¡我会看看它是否有效 – 2009-11-18 12:32:49