2012-06-20 15 views
26

मैं दो नियमित अभिव्यक्तियों को तैयार करने की कोशिश कर रहा हूं जो यूआरआई से मेल खाते हैं। ये यूआरआई प्रारूप के हैं: /foo/someVariableData और /foo/someVariableData/bar/someOtherVariableDataजावा रेगेक्स: नकारात्मक लुकहेड

मुझे दो regexes की आवश्यकता है। प्रत्येक को एक मैच करने की जरूरत है लेकिन दूसरे नहीं।

regexes मैं मूल रूप से के साथ आया हैं: /foo/.+ और /foo/.+/bar/.+ क्रमशः।

मुझे लगता है कि दूसरा रेगेक्स ठीक है। यह केवल दूसरी स्ट्रिंग से मेल खाएगा। पहला रेगेक्स, हालांकि, दोनों से मेल खाता है। तो, मैंने नकारात्मक दिखने के साथ (पहली बार) खेलना शुरू कर दिया। मैं regex /foo/.+(?!bar) बनाया गया है और यह

public static void main(String[] args) { 
    String shouldWork = "/foo/abc123doremi"; 
    String shouldntWork = "/foo/abc123doremi/bar/def456fasola"; 
    String regex = "/foo/.+(?!bar)"; 
    System.out.println("ShouldWork: " + shouldWork.matches(regex)); 
    System.out.println("ShouldntWork: " + shouldntWork.matches(regex)); 
} 

परीक्षण करने के लिए निम्न कोड की स्थापना की और, बेशक, उन दोनों true को हल।

कोई भी जानता है कि मैं क्या गलत कर रहा हूं? मुझे जरूरी नकारात्मक लुकहेड का उपयोग करने की आवश्यकता नहीं है, मुझे बस समस्या को हल करने की ज़रूरत है, और मुझे लगता है कि नकारात्मक लुकहेड ऐसा करने का एक तरीका हो सकता है।

धन्यवाद,

उत्तर

51

String regex = "/foo/(?!.*bar).+"; 

या संभवतः

String regex = "/foo/(?!.*\\bbar\\b).+"; 

प्रयास करें /foo/baz/crowbars की तरह पथ जो मुझे लगता है आपको लगता है कि रेगुलर एक्सप्रेशन से मेल करना चाहते हैं पर विफलताओं से बचने के लिए।

स्पष्टीकरण:

/foo/ # Match "/foo/" 
(?! # Assert that it's impossible to match the following regex here: 
.* # any number of characters 
\b # followed by a word boundary 
bar # followed by "bar" 
\b # followed by a word boundary. 
)  # End of lookahead assertion 
.+ # Match one or more characters 

\b, "शब्द सीमा लंगर", अल्फानुमेरिक चरित्र और एक गैर अक्षरांकीय चरित्र के बीच खाली जगह से मेल खाता है (डबल जावा तार के लिए आवश्यक बैकस्लैश के बिना) (या स्ट्रिंग के प्रारंभ/अंत और एक एलनम चरित्र के बीच)। इसलिए, यह b से पहले r"bar" में मेल खाता है, लेकिन यह w और b के बीच "crowbar" में मिलान करने में विफल रहता है।

प्रोटिप: http://www.regular-expressions.info पर एक नज़र डालें - एक महान रेगेक्स ट्यूटोरियल।

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