Regex String.matches () में काम नहीं करता है


147

मेरे पास कोड का यह छोटा टुकड़ा है

String[] words = {"{apf","hum_","dkoe","12f"};
for(String s:words)
{
    if(s.matches("[a-z]"))
    {
        System.out.println(s);
    }
}

छापना माना

dkoe

लेकिन यह कुछ भी नहीं छापता है !!


41
जावा matchesशुरू में एक ^ डालता है और आप के लिए regexes के अंत में एक $। तो matches("[a-z]")वास्तव में / ^ [az] $ / बदले की तलाश करेंगे।
रोबिनो

हाँ @ रोबिनो तुम बिलकुल सही हो।
मिहिर

1
निश्चित रूप से, यदि आप matchesकिसी भी घटना को देखने की उम्मीद करते हैं [a-z], तो यह उन सभी से मेल खाना चाहिए? मैं matchesरेगेक्स के खिलाफ व्यक्तिगत रूप से प्रत्येक चरित्र की जांच करने की उम्मीद नहीं करूंगा ।
फिलिपिंस

@ रोबिनो: उस कार्यक्षमता का वर्णन / दस्तावेज कहां किया गया है?
तोरु

@Toru स्ट्रिंग डॉक्स के लिए जावा डॉक्स पेज पर - और कहां? "जावा स्ट्रिंग डॉक्यूमेंटेशन" के एक आकस्मिक Google से पता चलता है कि, शीर्ष परिणाम में, वाक्यांश "str.matches (regex) बिल्कुल अभिव्यक्ति के समान परिणाम देता है"। महत्वपूर्ण शब्द "बिल्कुल" है।
रॉबिनो

जवाबों:


323

जावा की गलत .matches()विधि में आपका स्वागत है ... यह सभी इनपुट की कोशिश करता है और मेल खाता है। दुर्भाग्य से, अन्य भाषाओं ने सूट का पालन किया है :(

यदि आप देखना चाहते हैं कि रेगेक्स एक इनपुट टेक्स्ट से मेल खाता है, तो a Pattern, Matcherऔर a .find()(मेचर की विधि) का उपयोग करें:

Pattern p = Pattern.compile("[a-z]");
Matcher m = p.matcher(inputstring);
if (m.find())
    // match

यदि आप जो चाहते हैं वह वास्तव में यह देखने के लिए है कि क्या किसी इनपुट में केवल लोअरकेस अक्षर हैं, तो आप उपयोग कर सकते हैं .matches(), लेकिन आपको एक या एक से अधिक वर्णों का मिलान करने की आवश्यकता है: +अपने चरित्र वर्ग में जोड़ें, जैसे कि [a-z]+। या उपयोग ^[a-z]+$और .find()


2
मैं अधूरा ट्यूटोरियल के 100s ऑनलाइन पाते हैं। एक अच्छा नहीं मिल सका। क्या तुम्हारे पास कोई सुझाव है?
जॉन

समझाने के लिए Thanx @fge .matches()। क्या आप जानते हैं कि इस उदाहरण.find() में काम इतना धीमा क्यों है ?
कोनस्टेंटिन कोनपोको

3
सूट के बाद अन्य भाषाओं का क्या मतलब है ? मैं जो जानता हूं, उसमें केवल C ++ में विधियों का एक समान सेट है - regex_searchऔर regex_match। पायथन में, re.matchकेवल स्ट्रिंग की शुरुआत में मैच को एंकर करता है (जैसे कि यह था \Apattern) और पायथन 3.x को एक अच्छा .fullmatch()तरीका मिला है । JS, Go, PHP और .NET में, कोई रेगेक्स तरीके नहीं हैं जो मैच को स्पष्ट रूप से एंकर करते हैं। ElasticSearch, XML स्कीमा और HTML5 / Validators Angluar पैटर्न हमेशा डिफ़ॉल्ट रूप से लंगर डालते हैं। स्विफ्ट / ऑब्जेक्टिव सी में, एक विकल्प के साथ शुरुआत में पैटर्न को लंगर करने का एक तरीका है।
विकटोरिया स्ट्राइब्यू

वहाँ ऐसा करने के लिए एक oneliner तरीका है?
कार्डिनल - मोनिका

44

[a-z]एक और z के बीच एक ही मिलान से मेल खाता है । इसलिए, यदि आपका स्ट्रिंग सिर्फ "d"उदाहरण के लिए था, तो यह मेल खा जाता था और प्रिंट आउट हो जाता था।

आपको [a-z]+एक या अधिक वर्णों के मिलान के लिए अपने regex को बदलने की आवश्यकता है ।


12
बेशक यह एक चार से मेल खाता है, वही है जो regexp करता है! हालांकि यह स्पष्ट नहीं है (और यह मामला भी नहीं होना चाहिए!) यह है कि जावा प्रीफ़िक्स ^और प्रत्यय $को प्रदान किए गए rexxp के चारों ओर रखता है , इसे अवांछित रूप से बदल देता है और अजीब कीड़े बनाता है। उन्हें ऐसा नहीं करना चाहिए, क्योंकि ऐसा नहीं है कि शुरुआती रेगीक्सप का मतलब क्या था।
कलार

28

String.matchesरिटर्न पूरे स्ट्रिंग regex से मेल खाता है, न कि केवल किसी भी विकल्प।


3
कुछ ऐसा जो वास्तव में एक दुखद वास्तविकता है कि आप सही हैं। मैं वास्तव में नहीं जानता कि उन्होंने ऐसा क्यों किया।
होला

16

रीवाक्स के जावा के कार्यान्वयन पूरे स्ट्रिंग से मेल खाने की कोशिश करते हैं

यह perl regexes से अलग है, जो एक मेल खाने वाले भाग को खोजने की कोशिश करते हैं

यदि आप कुछ भी नहीं बल्कि कम अक्षर वाले स्ट्रिंग ढूंढना चाहते हैं, तो पैटर्न का उपयोग करें [a-z]+

यदि आप कम से कम एक कम वर्ण वाले स्ट्रिंग को ढूंढना चाहते हैं, तो पैटर्न का उपयोग करें .*[a-z].*




12

उपयोग किया गया

String[] words = {"{apf","hum_","dkoe","12f"};
    for(String s:words)
    {
        if(s.matches("[a-z]+"))
        {
            System.out.println(s);
        }
    }

4

मैंने एक ही समस्या का सामना किया है:

Pattern ptr = Pattern.compile("^[a-zA-Z][\\']?[a-zA-Z\\s]+$");

उपरोक्त विफल रहा!

Pattern ptr = Pattern.compile("(^[a-zA-Z][\\']?[a-zA-Z\\s]+$)");

ऊपर (और भीतर पैटर्न के साथ काम किया )


2

आपकी नियमित अभिव्यक्ति [a-z]मेल नहीं खाती है dkoeक्योंकि यह केवल स्ट्रिंग के मिलान से मेल खाता है [a-z]+। कुछ इस तरह का उपयोग करें ।


-1

आपको कम से कम ()मैच के पैटर्न में कैप्चर करना होगा और इस तरह सही पैटर्न देना होगा:

String[] words = {"{apf","hum_","dkoe","12f"};
for(String s:words)
{
    if(s.matches("(^[a-z]+$)"))
    {
        System.out.println(s);
    }
}

कोष्ठक कुछ भी नहीं बदला।
ताउनिउक

@Touniouk कोष्ठक के बिना matchesकोई आउटपुट नहीं है।
मोहसिन

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