जावा में String.contains () पद्धति में regex का उपयोग कैसे करें


112

मैं जांचना चाहता हूं कि क्या एक स्ट्रिंग में "स्टोर", "स्टोर" और "उत्पाद" शब्द शामिल हैं, कोई फर्क नहीं पड़ता कि उनके बीच क्या है।

मैंने प्रयोग करने की कोशिश की someString.contains(stores%store%product);और भी.contains("stores%store%product");

क्या मुझे स्पष्ट रूप से एक regex घोषित करने और इसे विधि पर पारित करने की आवश्यकता है या क्या मैं एक regex पास नहीं कर सकता?

जवाबों:


125

String.contains

String.containsस्ट्रिंग के साथ काम करता है, अवधि। यह regex के साथ काम नहीं करता है। यह जांच करेगा कि वर्तमान स्ट्रिंग में निर्दिष्ट स्ट्रिंग सही है या नहीं।

ध्यान दें कि String.containsशब्द सीमा के लिए जाँच नहीं करता है; यह केवल प्रतिस्थापन के लिए जाँच करता है।

रेगेक्स समाधान

रेगेक्स की तुलना में अधिक शक्तिशाली है String.contains, क्योंकि आप कीवर्ड (अन्य चीजों के बीच) पर शब्द सीमा को लागू कर सकते हैं। इसका अर्थ है कि आप कीवर्ड्स को केवल सब्स्टिट्यूटिंग के बजाय शब्दों के रूप में खोज सकते हैं

String.matchesनिम्नलिखित regex के साथ प्रयोग करें :

"(?s).*\\bstores\\b.*\\bstore\\b.*\\bproduct\\b.*"

RAW regex (स्ट्रिंग शाब्दिक में किए गए पलायन को दूर करें - यह तब होता है जब आप ऊपर दिए गए स्ट्रिंग को प्रिंट करते हैं):

(?s).*\bstores\b.*\bstore\b.*\bproduct\b.*

\bशब्द सीमा के लिए चेक, ताकि आप के लिए एक मैच नहीं मिलता है restores store products। ध्यान दें कि stores 3store_productअंक और के बाद से भी खारिज कर दिया गया है_ एक शब्द का हिस्सा माना जाता है, लेकिन मुझे संदेह है कि यह मामला प्राकृतिक पाठ में दिखाई देता है।

चूंकि शब्द सीमा दोनों पक्षों के लिए जाँच की जाती है, इसलिए ऊपर दिए गए रेक्सक्स सटीक शब्दों की खोज करेंगे। दूसरे शब्दों में, stores stores productऊपर रेगेक्स से मेल नहीं खाएगा, क्योंकि आप storeबिना शब्द के खोज रहे हैं s

.आम तौर पर किसी भी चरित्र को नई पंक्ति वर्णों की संख्या के अलावा मेल खाते हैं । (?s)शुरुआत में .अपवाद के बिना किसी भी चरित्र से मेल खाता है (यह इंगित करने के लिए टिम पीटरज़क के लिए धन्यवाद)।


7
यदि (?s)स्ट्रिंग में नई सुर्खियाँ हैं, तो आप अपने regex की शुरुआत में जोड़ना चाह सकते हैं ।
टिम पीटरसन

मैं इसे एक URL में इस तरह चेक कर रहा हूँ >> store.nextag.com/store/4908844/product/1070625777/…
vipin8169

क्या आप यहाँ पहला बैकस्लैश समझा सकते हैं\\b
vipin8169

1
@ vipin8169: स्ट्रिंग में, आपको \एकल निर्दिष्ट करने के लिए दोगुना करने की आवश्यकता है \, इसलिए \\bइसकी व्याख्या की जाएगी \b, जैसा कि रॉ रेगेक्स में देखा गया है। \bशब्द सीमा से मेल खाता है, जैसा ऊपर बताया गया है।
न्हाथ्ठ

अगर मैच की जरूरत है ".Mydomain।" स्ट्रिंग में। फिर यह रेगेक्स को कैसे अपडेट करेगा। मेरा उपयोग मामला यह है कि "www.abc.mydomain.in.io" जिसमें .mydomain है। या नहीं
मनमोहन सोनी

111

matcher.find()आपकी जरूरत है उदाहरण:

Pattern.compile("stores.*store.*product").matcher(someString).find();

4
यह पसंद है। मुझे मैचर्स रेगेक्स अत्यधिक जटिल लगता है।
मैथ्टर

21

आप बस matchesस्ट्रींग क्लास की विधि का उपयोग कर सकते हैं ।

boolean result = someString.matches("stores.*store.*product.*");

14
आप के साथ शुरू करने की जरूरत है .*या यह केवल शुरुआत के साथ मेल खाता होगा stores
shmosel

पैटर्न के खिलाफ पूरे क्षेत्र से मेल खाने का प्रयास। ऐसा लगता है कि @shmosel सही है, नहीं?
पीटर डी बीई

1
खैर, यह सिर्फ मेल खाता है, लेकिन यह जांच नहीं करता है कि स्ट्रिंग में किसी भी स्थिति में पैटर्न है या नहीं। यह एक समाधान नहीं है कि ओपी क्या देखता है, मैं regexp को परिष्कृत करने का सुझाव देता हूं।
जी बी

2

यदि आप जांचना चाहते हैं कि किसी स्ट्रिंग में रेगेक्स का उपयोग नहीं किया गया है या नहीं, तो आप जो सबसे ज्यादा कर सकते हैं वह है खोजने () का उपयोग करके

    private static final validPattern =   "\\bstores\\b.*\\bstore\\b.*\\bproduct\\b"
    Pattern pattern = Pattern.compile(validPattern);
    Matcher matcher = pattern.matcher(inputString);
    System.out.print(matcher.find()); // should print true or false.

मिलान के बीच अंतर पर ध्यान दें (और खोजें) (), मैच () सही है अगर पूरे स्ट्रिंग दिए गए पैटर्न से मेल खाते हैं। find () एक विकल्प खोजने की कोशिश करता है जो किसी दिए गए इनपुट स्ट्रिंग में पैटर्न से मेल खाता है। खोज () का उपयोग करके भी आपको अतिरिक्त मिलान नहीं जोड़ना है जैसे - (? S)। * शुरुआत में और। * अपने regex पैटर्न के अंत में।


2
public static void main(String[] args) {
    String test = "something hear - to - find some to or tows";
    System.out.println("1.result: " + contains("- to -( \\w+) som", test, null));
    System.out.println("2.result: " + contains("- to -( \\w+) som", test, 5));
}
static boolean contains(String pattern, String text, Integer fromIndex){
    if(fromIndex != null && fromIndex < text.length())
        return Pattern.compile(pattern).matcher(text).find();

    return Pattern.compile(pattern).matcher(text).find();
}

1.साल: सच

2.साल: सच


fromIndexनजरअंदाज कर दिया है, है ना? contains("something", test, 5) => true
पीकेडेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.