2012-06-07 11 views
6

आप जावा रेगेक्स में एक से अधिक स्पेस कैरेक्टर से कैसे मेल खाते हैं?जावा रेगेक्स: एक या अधिक स्पेस वर्णों से कैसे मिलान करें

मेरे पास एक रेगेक्स है जिसे मैं मिलान करने की कोशिश कर रहा हूं। रेगेक्स विफल रहता है जब मेरे पास दो या दो से अधिक स्पेस वर्ण होते हैं।

public static void main(String[] args) { 
    String pattern = "\\b(fruit)\\s+([^a]+\\w+)\\b"; //Match 'fruit' not followed by a word that begins with 'a' 
    String str = "fruit apple"; //One space character will not be matched 
    String str_fail = "fruit apple"; //Two space characters will be matched 
    System.out.println(preg_match(pattern,str)); //False (Thats what I want) 
    System.out.println(preg_match(pattern,str_fail)); //True (Regex fail) 
} 

public static boolean preg_match(String pattern,String subject) { 
    Pattern regex = Pattern.compile(pattern); 
    Matcher regexMatcher = regex.matcher(subject); 
    return regexMatcher.find(); 
} 
+1

'मानक मानक पैटर्न' => स्ट्रिंग पैटर्न 'जावा मानक कोडिंग सम्मेलनों में। – assylias

+2

क्या है ... जावा कोड में PHP वाक्यविन्यास? – ean5533

+3

यह हो सकता है कि दूसरी जगह का मिलान किया जा सके [^ a] (एक स्थान एक 'ए' नहीं है) – erikxiv

उत्तर

12

समस्या वास्तव में backtracking की वजह से है। आपका regex:

"\\b(fruit)\\s+([^a]+\\w+)\\b" 

कहते हैं "फल, एक या अधिक रिक्त स्थान के द्वारा पीछा किया, एक या अधिक गैर 'एक' वर्ण के बाद, एक या अधिक 'शब्द' अक्षर के बाद"। कारण यह दो रिक्त स्थानों में विफल रहता है क्योंकि \s+ पहली जगह से मेल खाता है, लेकिन फिर दूसरा देता है, जो [^a]+ (दूसरी जगह के साथ) और \s+ भाग (पहले के साथ) को संतुष्ट करता है।

मुझे लगता है कि आप इसके बजाय पॉज़ेसिव क्वांटिफायर का उपयोग करके इसे ठीक कर सकते हैं, जो \s++ होगा। यह दूसरे स्थान चरित्र को वापस देने के लिए \s नहीं बताता है। आप जावा के क्वांटिफायर here पर प्रलेखन पा सकते हैं।

(तुम क्या वर्णन से परिणाम की उम्मीद देता है,)
  1. Using the possessive quantifier on \s
  2. Your current regex with separate groupings around [^a\]+ and \w+:


    एक उदाहरण के रूप में, यहाँ Rubular पर दो उदाहरण हैं। ध्यान दें कि दूसरा मैच समूह ([^a]+ का प्रतिनिधित्व) दूसरे स्थान चरित्र को कैप्चर कर रहा है।

+0

सही विश्लेषण और एक वैध समाधान गले लगाओ। एक दूसरा संभावित समाधान '[^ a] 'से' [^ a \ s]' को बदलना होगा। – ean5533

+0

@eldarerathis आपका समाधान \\ s ++ काम करता है। – MontrealDevOne

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