2013-08-02 11 views
15

मैं निम्नलिखित जावा कोड है:जावा रेगुलर एक्सप्रेशन से नकारात्मक lookbehind

Pattern pat = Pattern.compile("(?<!function)\\w+"); 
Matcher mat = pat.matcher("function example"); 
System.out.println(mat.find()); 

क्यों mat.find() वापसी सच है? मैंने नकारात्मक दिखने का उपयोग किया और examplefunction से पहले है। इसे त्यागना नहीं चाहिए?

उत्तर

29

देखें यह क्या मेल खाता है:

public static void main(String[] args) throws Exception { 
    Pattern pat = Pattern.compile("(?<!function)\\w+"); 
    Matcher mat = pat.matcher("function example"); 
    while (mat.find()) { 
     System.out.println(mat.group()); 
    } 
} 

आउटपुट:

function 
xample 

तो सबसे पहले यह function पाता है, जो "function" से पहले नहीं है। फिर यह xample पाता है जो function e से पहले है और इसलिए "function" नहीं है।

मुमकिन है आप पैटर्न पूरे पाठ मैच के लिए ही नहीं, मैचों पाठ में लगता है चाहता हूँ।

आप Matcher.matches() के साथ ऐसा कर सकते हैं या आप प्रारंभ और अंत एंकर को जोड़ने के लिए पैटर्न बदल सकते हैं: के रूप में यह मतलब है कि पैटर्न ही अपने मैच क्षेत्र को परिभाषित करता है बल्कि उसके बाद

^(?<!function)\\w+$ 

मैं दूसरा दृष्टिकोण पसंद करते हैं क्षेत्र को इसके उपयोग से परिभाषित किया जा रहा है। हालांकि यह वरीयता का मामला है। यहाँ

1

आपकी स्ट्रिंग में "फ़ंक्शन" शब्द है जो \ w + से मेल खाता है, और "फ़ंक्शन" से पहले नहीं है।

0

सूचना दो बातें:

  • आप find() जो साथ ही साथ एक उप स्ट्रिंग मैच के लिए सच रिटर्न का उपयोग कर रहे हैं।

  • उपर्युक्त के कारण, "फ़ंक्शन" मिलान करता है क्योंकि यह "फ़ंक्शन" से पहले नहीं है।
    पूरी स्ट्रिंग कभी मेल नहीं खाती क्योंकि आपके रेगेक्स में रिक्त स्थान शामिल नहीं थे।

उपयोग Mathcher#matches() या ^ और एक नकारात्मक अग्रदर्शी बजाय साथ $ एंकर:

Pattern pat = Pattern.compile("^(?!function)[\\w\\s]+$"); // added \s for whitespaces 
Matcher mat = pat.matcher("function example"); 

System.out.println(mat.find()); // false 
संबंधित मुद्दे