在java中匹配正则表达式

时间:2009-11-17 20:15:42

标签: java regex

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

什么是仅与hello ¡world匹配的模式?

我找不到的是一种否定文字字符串而不仅仅是字符串的方法。类似于:([^(¡\])]*)

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

4 个答案:

答案 0 :(得分:8)

只需在?

之后添加*即可
String pt = "\\[!(.*?)¡\\]";

答案 1 :(得分:4)

您需要害羞不情愿非贪婪)表达。

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

答案 2 :(得分:1)

要回答您的直接问题,仅当.不属于字符串¡]时才匹配的方法是使用否定的预测:

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

答案 3 :(得分:0)

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

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

此版本将匹配所有内容,直到找到括号并且只回溯一次以匹配¡