2010-04-09 17 views
5

में लोगों के साथ मेल नहीं खाते मैं इस regex है बदल देते हैं:वर्ण जो एक regex

private static final String SPACE_PATH_REGEX ="[a-z|A-Z|0-9|\\/|\\-|\\_|\\+]+"; 

मैं जाँच मेरी स्ट्रिंग इस regex से मेल खाता है, तो और यदि नहीं, तो मैं सभी वर्ण है जो यहाँ नहीं हैं बदलना चाहते हैं, साथ में "_"।

मैं तरह की कोशिश की है:

private static final String SPACE_PATH_REGEX_EXCLUDE = 
     "[~a-z|A-Z|0-9|\\/|\\-|\\_|\\+]+"; 
if (myCompanyName.matches(SPACE_PATH_REGEX)) { 
    myNewCompanySpaceName = myCompanyName; 
} else{ 
    myNewCompanySpaceName = myCompanyName.replaceAll(
      SPACE_PATH_REGEX_EXCLUDE, "_"); 
} 

लेकिन यह काम नहीं करता है ..., तो 2 रेगुलर एक्सप्रेशन "~" में निम्नलिखित वर्ण छोड़ नहीं रहा है।

कोई विचार?

उत्तर

8

आप अपने regex (नियमों के लिए Pattern class देखें) में कई समस्याएं हैं:

  • एक चरित्र वर्ग के अंदर | कोई विशेष अर्थ नहीं है और अपने मामले में प्रतिस्थापन के बिना हटा दिया जाना चाहिए (जब तक आप अपने चरित्र चाहते हैं शाब्दिक | चरित्र शामिल करने के लिए कक्षा)।
  • इसी तरह आपको एक चरित्र वर्ग के अंदर /, _ और + से बचने की आवश्यकता नहीं है।
  • - केवल अगर यह अंतिम वर्ण
  • ~ भी एक चरित्र वर्ग में कोई विशेष अर्थ नहीं यह सिर्फ खुद का प्रतिनिधित्व करता है नहीं है भागने की जरूरत है
  • आप ^ उपयोग करने के लिए एक चरित्र समूह की सामग्री नकारना चाहते हैं।

तुम भी, पहले matches() जांच को छोड़ अगर कुछ भी नहीं वैसे भी मेल खाता है के रूप में replaceAll() कॉल एक असंशोधित स्ट्रिंग वापस आ जाएगी कर सकते हैं। इसे (और दूसरी नियमित अभिव्यक्ति) रखने से केवल एक और जगह पेश की जाती है जहां बग छुपा सकते हैं (उदाहरण के लिए आप गलती से एक रेगेक्स अपडेट कर सकते हैं, लेकिन दूसरे नहीं)।

+0

स्पष्ट स्पष्टीकरण के लिए बहुत बहुत धन्यवाद। –

4

प्रयास करें:

final String SPACE_PATH_REGEX_EXCLUDE = "[^\\w~/\\-+]"; 
String out = in.replaceAll(SPACE_PATH_REGEX_EXCLUDE, "_"); 

प्राथमिक मुद्दा आप है कि आप अपने स्वरूप में लगा रहे हैं अनावश्यक | रों। उनके पास एक अलग अर्थ है। साथ ही, आप \w का उपयोग करके अपनी अभिव्यक्ति को बहुत सरल बना सकते हैं, जिसका अर्थ है "शब्द वर्ण", जिसका अर्थ है अक्षरों (अपरकेस या लोअरकेस), अंक या अंडरस्कोर और [A-Za-z0-9_] के समानार्थी हैं।

आपको यह समझने की जरूरत है कि कैसे काम से बच निकलता है। जावा स्ट्रिंग एस्केपिंग है, यही कारण है कि आपने पैटर्न में बैकस्लैश डालने के लिए \\ डाल दिया है। लेकिन रेगेक्स भी बच रहा है। उदाहरण के लिए \n जावा स्ट्रिंग न्यूलाइन कैरेक्टर है और \\n एक न्यूलाइन कैरेक्टर देखने के लिए \n को पैटर्न में रखने का अनुक्रम है।

  1. आप \Q...\E उपयोग कर सकते हैं:

    आप पाठ का एक समूह से बचने के लिए दो सुविधाजनक विकल्प हैं।\Q और \E के बीच कुछ भी बच निकला है; और

  2. आप एक मनमानी स्ट्रिंग को उद्धृत करने के लिए Pattern.quote() का उपयोग कर सकते हैं।

जहां आपको रेगेक्स में कुछ अनुक्रमों से बचने की आवश्यकता है, प्रासंगिक है। उदाहरण के लिए - केवल एक भाग को इंगित करने के लिए गलत किया जा सकता है अगर बचने की जरूरत है। [a-z] एक निचला मामला चरित्र है। [a\-z]a, - या z में से एक है। लेकिन आप लोअरकेस अक्षर के बाद एक हाइफ़न इंगित करने के लिए -[a-z] कर सकते हैं। नोट: आपको पहले हाइफ़न से बचने की आवश्यकता नहीं है।

+0

मुझे लगता है कि आपको '-' से बचने की आवश्यकता है –

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