2009-06-30 31 views
6

Tôi muốn khớp mọi thứ trừ *.xhtml. Tôi có một servlet nghe *.xhtml và tôi muốn một servlet khác bắt được mọi thứ khác. Nếu tôi ánh xạ Faces Servlet cho mọi thứ (*), nó sẽ phát ra khi xử lý các biểu tượng, bảng định kiểu và mọi thứ không phải là yêu cầu khuôn mặt.Biểu thức chính quy Java, khớp với mọi thứ nhưng

Đây là những gì tôi đã cố gắng không thành công.

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

Bất kỳ ý tưởng nào?

Cảm ơn,

Walter

Trả lời

13

Những gì bạn cần là một negative lookbehind (java example).

String regex = ".*(?<!\\.xhtml)$"; 
Pattern pattern = Pattern.compile(regex); 

Mẫu này khớp với bất kỳ thứ gì không kết thúc bằng ".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."); 
    } 
    } 
} 

vậy:

% javac NegativeLookbehindExample.java && java NegativeLookbehindExample                                   
"example.dot" is a match. 
"example.xhtml" is NOT a match. 
"example.xhtml.thingy" is a match. 
+0

Thật không may, điều này không hoạt động (được kiểm tra để xác nhận nó); có lẽ bởi vì khẳng định nhìn phía trước tiêu cực cần một cái gì đó khác để nhìn về phía trước! –

+0

OK, vào thời điểm tôi đăng nhận xét ở trên, câu trả lời đã được chỉnh sửa thành xác nhận ngược lại tiêu cực. Nhưng điều này cũng không hiệu quả. –

+0

Chắc chắn có - hãy thử mã mẫu. – rampion

7

Không cụm từ thông dụng, nhưng tại sao sử dụng khi bạn không cần phải?

String page = "blah.xhtml"; 

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

Bạn có thể sử dụng các tiêu cực nhìn về phía trước khẳng định:

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

Xin lưu ý rằng ở trên chỉ phù hợp nếu đầu vào có chứa một phần mở rộng (.something).

+0

Thao tác này cũng sẽ thả "an.xhtml.example.document.txt" – rampion

0

Bạn thực sự chỉ thiếu một "$" ở cuối mẫu của bạn và một cái nhìn tiêu cực propper phía sau (rằng "(^())" không làm điều đó). Xem các cấu trúc đặc biệt một phần của the syntax.

Các mô hình đúng sẽ là:

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

Một công cụ kiểm tra Regular Expression là vô giá trong các tình huống khi bạn thường dựa vào dân để kiểm tra biểu thức của bạn cho bạn tăng gấp đôi. Thay vì viết của riêng bạn, hãy sử dụng một số thứ như RegexBuddy trên Windows hoặc Reggy trên Mac OS X. Những công cụ này có cài đặt cho phép bạn chọn công cụ biểu thức chính quy của Java (hoặc một công việc) để thử nghiệm. Nếu bạn cần kiểm tra các biểu thức .NET, hãy thử Expresso. Ngoài ra, bạn chỉ có thể sử dụng test-harness của Sun từ hướng dẫn của họ, nhưng nó không phải là hướng dẫn để hình thành các biểu thức mới.

Các vấn đề liên quan