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
匹配的模式?
我找不到的是一种否定文字字符串而不仅仅是字符串的方法。类似于:([^(¡\])]*)
问题是:
如何匹配不是文字字符串的所有内容?
答案 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 = "\[!([^]]*)¡\]";
此版本将匹配所有内容,直到找到括号并且只回溯一次以匹配¡