我想匹配*.xhtml
以外的所有内容。我有一个servlet正在监听*.xhtml
,我希望另一个servlet能够捕获其他所有内容。如果我将Faces Servlet映射到所有内容(*
),它会在处理图标,样式表和所有非面孔请求时发生爆炸。
这是我一直尝试失败的原因。
Pattern inverseFacesUrlPattern = Pattern.compile(".*(^(\\.xhtml))");
有什么想法吗?
谢谢,
沃尔特
答案 0 :(得分:13)
您需要的是negative lookbehind(java example)。
String regex = ".*(?<!\\.xhtml)$";
Pattern pattern = Pattern.compile(regex);
此模式匹配任何不以“.xhtml”结尾的内容。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class NegativeLookbehindExample {
public static void main(String args[]) throws Exception {
String regex = ".*(?<!\\.xhtml)$";
Pattern pattern = Pattern.compile(regex);
String[] examples = {
"example.dot",
"example.xhtml",
"example.xhtml.thingy"
};
for (String ex : examples) {
Matcher matcher = pattern.matcher(ex);
System.out.println("\""+ ex + "\" is " + (matcher.find() ? "" : "NOT ") + "a match.");
}
}
}
这样:
% javac NegativeLookbehindExample.java && java NegativeLookbehindExample
"example.dot" is a match.
"example.xhtml" is NOT a match.
"example.xhtml.thingy" is a match.
答案 1 :(得分:7)
不是正则表达式,但为什么在不必使用时使用?
String page = "blah.xhtml";
if( page.endsWith( ".xhtml" ))
{
// is a .xhtml page match
}
答案 2 :(得分:0)
你可以使用负面的前瞻断言:
Pattern inverseFacesUrlPattern = Pattern.compile("^.*\\.(?!xhtml).*$");
请注意,如果输入包含扩展名(.something),则上述内容仅匹配。
答案 3 :(得分:0)
你真的只是在你的模式结尾处错过了一个“$
”和一个支持者负面的后卫(“(^())
”没有这样做)。查看the syntax的特殊构造部分。
正确的模式是:
.*(?<!\.xhtml)$
^^^^-------^ This is a negative look-behind group.
正常表达式测试工具在这些情况下非常宝贵,因为您通常会依赖人们为您仔细检查您的表达式。请不要自己编写,而是在Windows上使用RegexBuddy或在Mac OS X上使用Reggy。这些工具具有允许您选择Java的正则表达式引擎(或类似工具)进行测试的设置。如果您需要测试.NET表达式,请尝试Expresso。另外,您可以在他们的教程中使用Sun的test-harness,但这对于形成新表达式并不具有指导意义。