2009-06-30 18 views
6

मैं सबकुछ मिलान करना चाहता हूं लेकिन *.xhtml। मेरे पास *.xhtml पर एक सर्वलेट सुन रहा है और मैं चाहता हूं कि एक और सर्वलेट सबकुछ पकड़ ले। यदि मैं सब कुछ (*) पर फेस सर्विसलेट को मैप करता हूं, तो यह आइकन, स्टाइलशीट, और चेहरे के अनुरोध वाले सभी चीज़ों को संभालने के दौरान बाहर निकलता है।जावा नियमित अभिव्यक्ति, सबकुछ से मेल खाता है लेकिन

यही वह है जो मैं असफल प्रयास कर रहा हूं।

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

कोई विचार?

धन्यवाद,

वाल्टर

उत्तर

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. 
+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. 

एक नियमित अभिव्यक्ति परीक्षण उपकरण इन स्थितियों में अमूल्य है। अपने स्वयं के लिखने के बजाय कृपया मैक ओएस एक्स पर RegexBuddy या मैक ओएस एक्स पर Reggy जैसे कुछ का उपयोग करें। इन टूल्स में आपको जावा के नियमित अभिव्यक्ति इंजन (या एक काम-समान) को परीक्षण के लिए चुनने की अनुमति है। यदि आपको .NET अभिव्यक्तियों का परीक्षण करने की आवश्यकता है तो Expresso आज़माएं। इसके अलावा, आप अपने ट्यूटोरियल से सूर्य के test-harness का उपयोग कर सकते हैं, लेकिन यह नए अभिव्यक्तियों के निर्माण के लिए निर्देशक नहीं है।

संबंधित मुद्दे