क्या जावा RegEx केस-असंवेदनशील है?


111

जावा में, जब एक रेगेक्स पैटर्न देखने के लिए एक प्रतिरूप कर रहे हैं जैसे:

replaceAll("\\?i\\b(\\w+)\\b(\\s+\\1)+\\b", "$1"); 

(डुप्लिकेट लगातार केस-असंवेदनशील शब्दों को हटाने के लिए, उदाहरण के लिए टेस्ट टेस्ट), मुझे यकीन नहीं है कि मैंने कहाँ रखा है ?i। मैंने पढ़ा है कि यह शुरुआत में माना जाता है, लेकिन अगर मैं इसे बाहर निकालता हूं तो मैं लगातार शब्द (जैसे परीक्षण परीक्षण) दोहराता हूं, लेकिन मामला-असंवेदनशील शब्द (जैसे टेस्ट परीक्षण) नहीं। इसलिए मुझे लगा कि मैं शुरुआत में इसे जोड़ सकता हूं लेकिन ऐसा लगता है कि काम पूरा नहीं हुआ है। कोई विचार? धन्यवाद!


इस बाहर की जाँच करें stackoverflow.com/a/55980176/3593084
Mr.Q

जवाबों:


119

RegexBuddy मुझे बता रहा है कि क्या आप इसे शुरुआत में शामिल करना चाहते हैं, यह सही सिंटैक्स है:

"(?i)\\b(\\w+)\\b(\\s+\\1)+\\b"

167

आप केस को असंवेदनशील रीजैक्स से भी मिलान कर सकते हैं और पैटर्न का उपयोग करके इसे अधिक पठनीय बना सकते हैं। CASE_INSENSITIVE निरंतरता जैसे:

Pattern mypattern = Pattern.compile(MYREGEX, Pattern.CASE_INSENSITIVE);
Matcher mymatcher= mypattern.matcher(mystring);

2
Mmmm .... Pattern.compile(myregex, Pattern.MULTILINE | Pattern.CASE_INSENSITIVE)
बिटवाइन

4
यह इस (?i)चीज की तुलना में बहुत अधिक पठनीय है , जावा रेग्जेस पहले से ही काफी अपठनीय थे: एस
बार्टेक बैनचेविक्ज़

यह वही उत्तर है जो 4 साल पहले के रेलेट के उत्तर के रूप में था, फिर भी इसे सभी वोट मिले। अजीब।
झूमझूम

@Zoomzoom, यह तब नहीं था जब मैंने इसे लिखा था :) यदि आप रीलेट के संस्करण के इतिहास की जांच करते हैं तो आप इसे 2018 में इसे बदलकर देखते हैं stackoverflow.com/posts/3436124/…
ईसाई विल्मा

126

हां, जावा रेगेक्स में वसीयत असंवेदनशीलता सक्षम और अक्षम की जा सकती है।

ऐसा लगता है कि आप कुछ इस तरह चाहते हैं:

    System.out.println(
        "Have a meRry MErrY Christmas ho Ho hO"
            .replaceAll("(?i)\\b(\\w+)(\\s+\\1)+\\b", "$1")
    );
    // Have a meRry Christmas ho

ध्यान दें कि एम्बेडेड Pattern.CASE_INSENSITIVE ध्वज (?i)नहीं है \?i। यह भी ध्यान दें कि एक सुपरफ्लस \bको पैटर्न से हटा दिया गया है।

(?i)केस-असंवेदनशीलता सक्षम करने के लिए पैटर्न की शुरुआत में रखा गया है। इस विशेष मामले में, पैटर्न में बाद में इसे ओवरराइड नहीं किया जाता है, इसलिए वास्तव में पूरा पैटर्न केस-असंवेदनशील होता है।

यह ध्यान देने योग्य है कि वास्तव में आप केस-असंवेदनशीलता को पूरे पैटर्न के केवल कुछ हिस्सों तक सीमित कर सकते हैं। इस प्रकार, सवाल यह है कि इसे कहां रखा जाए, यह विनिर्देश पर निर्भर करता है (हालांकि इस विशेष समस्या के लिए यह \wमामला-असंवेदनशील नहीं है।

प्रदर्शित करने के लिए, यहाँ "AaAaaA"सिर्फ अक्षरों की तरह रनों के ढहने का एक समान उदाहरण है "A"

    System.out.println(
        "AaAaaA eeEeeE IiiIi OoooOo uuUuUuu"
            .replaceAll("(?i)\\b([A-Z])\\1+\\b", "$1")
    ); // A e I O u

अब मान लें कि हम निर्दिष्ट करते हैं कि रन केवल तभी ढह जाना चाहिए जब यह एक बड़े अक्षर से शुरू होता है। फिर हमें (?i)उपयुक्त जगह पर रखना होगा :

    System.out.println(
        "AaAaaA eeEeeE IiiIi OoooOo uuUuUuu"
            .replaceAll("\\b([A-Z])(?i)\\1+\\b", "$1")
    ); // A eeEeeE I O uuUuUuu

आम तौर पर, आप अपनी इच्छानुसार किसी भी ध्वज को पैटर्न के भीतर सक्षम और अक्षम कर सकते हैं।

यह सभी देखें

  • java.util.regex.Pattern
  • regular-expressions.info/Modifiers
    • नियमित अभिव्यक्ति के अंदर निर्दिष्ट मोड
      • इसके बजाय /regex/i( Pattern.CASE_INSENSITIVEजावा में) आप कर सकते हैं/(?i)regex/
    • नियमित अभिव्यक्ति के केवल भाग के लिए चालू और बंद करना
      • आप भी कर सकते हैं /first(?i)second(?-i)third/
    • संशोधक स्पान
      • आप भी कर सकते हैं /first(?i:second)third/
  • नियमित-expressions.info/Word सीमाएँ (वहाँ हमेशा \bएक \wऔर एक के बीच एक है \s)

संबंधित सवाल


36

यदि आपकी पूरी अभिव्यक्ति असंवेदनशील है, तो आप केवल CASE_INSENSITIVEध्वज निर्दिष्ट कर सकते हैं :

Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)

जवाब के लिए धन्यवाद। यह वास्तव में मैं देख रहा था। अजगर में हम re.IGNORECASE JAVA में इसी तरह के जवाब की तलाश में थे।
Doogle

0

आप अपने प्रारंभिक स्ट्रिंग का नेतृत्व भी कर सकते हैं, जिसे आप पैटर्न मिलान के लिए जांचने जा रहे हैं, निचले मामले में। और क्रमशः अपने पैटर्न निचले मामले के प्रतीकों में उपयोग करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.