2009-06-30 2 views
6

*.xhtml以外はすべて一致したいと思います。私は*.xhtmlに耳を傾けるサーブレットを持っています。 Facesサーブレットをすべてにマップすると(*)、アイコン、スタイルシート、およびフェイスリクエストではないものを処理するときに爆発します。Javaの正規表現ですが、すべて一致します

これは私が失敗したことです。

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

必要なもののおかげで、

ウォルター

答えて

13

negative lookbehindjava example)です。

このパターンは、 ".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. 
+0

残念ながら、これは機能しません(確認のためにテストされています)。おそらくネガティブなルックアヘッドアサーションは先読みするために何か他のものを必要とするからです! –

+0

私が上記のコメントを投稿するまでに、その答えは否定的なルック・バック・アサーションに編集されました。しかし、これはどちらもうまくいかない。 –

+0

もちろん、サンプルコードを試してみてください。 – rampion

7

ない定期expresionが、なぜあなたはしていないときということでしょうか?あなたが負の先読みアサーション使用することができ

String page = "blah.xhtml"; 

if(page.endsWith(".xhtml")) 
{ 
    // is a .xhtml page match 
}  
0

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

を入力拡張(.somethingを)が含まれている場合上記にのみ一致していることに注意してください。

+0

これはまた、 "an.xhtml.example.document.txt" – rampion

0

実際にパターンの最後には「$」が表示されていますが、これはプロッタのネガティブな裏返しです(「(^())」はそうしていません)。 特別な構造の部分をthe syntaxの部分に見てください。

正しいパターンは次のようになります。あなたが正常にあなたのために式をダブルチェックする人に依存しているだろうというとき

.*(?<!\.xhtml)$ 
    ^^^^-------^ This is a negative look-behind group. 

正規表現テストツールは、これらの状況で非常に貴重です。自分で書くのではなく、Windowsの場合はRegexBuddy、Mac OS Xの場合はReggyなどのツールを使用してください。これらのツールでは、テスト用にJavaの正規表現エンジン(または類似したもの)を選択できる設定があります。 .NET式をテストする必要がある場合は、Expressoを試してください。また、SunのチュートリアルでSunのtest-harnessを使用することもできますが、新しい表現を作成するのに有益な方法ではありません。

関連する問題