Java正则表达式,但匹配所有内容

时间:2009-06-30 03:57:30

标签: java regex seam

我想匹配*.xhtml以外的所有内容。我有一个servlet正在监听*.xhtml,我希望另一个servlet能够捕获其他所有内容。如果我将Faces Servlet映射到所有内容(*),它会在处理图标,样式表和所有非面孔请求时发生爆炸。

这是我一直尝试失败的原因。

Pattern inverseFacesUrlPattern = Pattern.compile(".*(^(\\.xhtml))");

有什么想法吗?

谢谢,

沃尔特

4 个答案:

答案 0 :(得分:13)

您需要的是negative lookbehindjava 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,但这对于形成新表达式并不具有指导意义。