नियमित अभिव्यक्ति विषय स्ट्रिंग में व्हॉट्सएप को कैसे अनदेखा करें?


107

क्या एक नियमित अभिव्यक्ति पैटर्न का उपयोग करके मैचों की खोज करते समय लक्ष्य स्ट्रिंग में सफेद स्थान को अनदेखा करने का एक सरल तरीका है? उदाहरण के लिए, यदि मेरी खोज "बिल्लियों" के लिए है, तो मैं "सी एटीएस" या "सीए टीएस" से मिलान करना चाहूंगा। मैं व्हॉट्सएप को पहले से नहीं छीन सकता क्योंकि मुझे उस मैच को हाइलाइट करने के लिए मैच का आरंभ और अंत सूचकांक (किसी भी व्हाट्सएप सहित) को खोजने की जरूरत है और किसी भी व्हाट्सएप को फॉर्मेटिंग उद्देश्यों के लिए होने की जरूरत है।

जवाबों:


124

आप \s*अपने व्हाट्सएप में हर दूसरे चरित्र के बीच वैकल्पिक व्हाट्सएप अक्षर चिपका सकते हैं । यद्यपि दी गई, यह थोड़ी लंबी हो जाएगी।

/cats/ -> /c\s*a\s*t\s*s/


धन्यवाद, लगता है कि जाने का रास्ता है। लेकिन मुझे बस एहसास हुआ कि मैं केवल वैकल्पिक व्हाट्सएप चरित्र चाहता हूं अगर वे एक नई पंक्ति का पालन करते हैं। इसलिए उदाहरण के लिए, "c \ n ats" या "ca \ n ts" का मिलान होना चाहिए। लेकिन अगर कोई नई लाइन नहीं है तो "c ats" को मैच के लिए नहीं चाहिए। कैसे किया जा सकता है पर कोई विचार?
स्टीवन

@ देखें, मैंने इसे नीचे कैसे किया, आप इस तरह के विशिष्ट मामलों में मेरे समाधान को आसानी से अपना सकते हैं।
बॉब

@ क्रिस मुझे लगता है, यह रेगेक्स केवल बिल्लियों के लिए बहुत सख्त है, यह इस तरह के किसी भी खोज के लिए भी लिख सकता है: ^([a-z]\s*)+$
संदीप कौर

9

सैम ड्यूफेल के जवाब में स्टीवन की टिप्पणी को संबोधित करते हुए

धन्यवाद, लगता है कि जाने का रास्ता है। लेकिन मुझे बस एहसास हुआ कि मैं केवल वैकल्पिक व्हाट्सएप चरित्र चाहता हूं अगर वे एक नई पंक्ति का पालन करते हैं। इसलिए उदाहरण के लिए, "c \ n ats" या "ca \ n ts" का मिलान होना चाहिए। लेकिन अगर कोई नई लाइन नहीं है तो "c ats" को मैच के लिए नहीं चाहिए। कैसे किया जा सकता है पर कोई विचार?

यह काम कर जाना चाहिए:

/c(?:\n\s*)?a(?:\n\s*)?t(?:\n\s*)?s/

'बिल्लियों' के सभी विभिन्न रूपों के लिए इस पृष्ठ को देखें कि यह मेल खाता है।

आप इसे सशर्त का उपयोग करके भी हल कर सकते हैं , लेकिन वे रेगेक्स के जावास्क्रिप्ट स्वाद में समर्थित नहीं हैं।


3
बहुत बदसूरत है। इसके लिए अवश्य ही एक बेहतर तरीका होना चाहिए। '
james.garriss

आप इसे जेएस सिंटैक्स में अधिक पठनीय बना सकते हैं (हालांकि तकनीक अन्य भाषाओं में काम करेगी):new RegExp('cats'.split('').join('(?:\n\s*)?'))
ब्रायनरी

7

जबकि स्वीकृत उत्तर तकनीकी रूप से सही है, यदि संभव हो तो एक अधिक व्यावहारिक दृष्टिकोण, नियमित अभिव्यक्ति और खोज स्ट्रिंग दोनों में से सिर्फ व्हाट्सएप को स्ट्रिप करना है।

यदि आप इसके बजाय "मेरी बिल्लियाँ" खोजना चाहते हैं, तो:

myString.match(/m\s*y\s*c\s*a\*st\s*s\s*/g)

बस करो:

myString.replace(/\s*/g,"").match(/mycats/g)

चेतावनी: आप इसे नियमित अभिव्यक्ति पर स्वचालित रूप से खाली स्थानों के साथ सभी स्थानों को बदलकर स्वचालित नहीं कर सकते, क्योंकि वे एक नकार में हो सकते हैं या अन्यथा आपकी नियमित अभिव्यक्ति को अमान्य बना सकते हैं।


5

आप \s*अपने खोज स्ट्रिंग में प्रत्येक वर्ण को इनबिल्ट कर सकते हैं, इसलिए यदि आप उस बिल्ली की तलाश कर रहे हैं जिसका आप उपयोग करेंगेc\s*a\s*t\s*s\s*s

यह लंबा है, लेकिन आप स्ट्रिंग को गतिशील रूप से बना सकते हैं।

आप इसे यहां काम करते हुए देख सकते हैं: http://www.rubular.com/r/zzWwvppSpE


3

यदि आप केवल रिक्त स्थान की अनुमति देना चाहते हैं, तो

\bc *a *t *s\b

करना चाहिए। टैब को भी अनुमति देने के लिए, का उपयोग करें

\bc[ \t]*a[ \t]*t[ \t]*s\b

\bएंकरों को हटा दें अगर आप भी catsशब्दों को भीतर ढूंढना चाहते हैं जैसे bobcatsया catsup


1

इस दृष्टिकोण का उपयोग इसे स्वचालित करने के लिए किया जा सकता है (निम्नलिखित अनुकरणीय समाधान अजगर में है, हालांकि स्पष्ट रूप से इसे किसी भी भाषा में पोर्ट किया जा सकता है):

आप व्हॉट्सएप को पहले से ही बंद कर सकते हैं और गैर-व्हाट्सएप पात्रों की स्थिति को बचा सकते हैं ताकि आप बाद में उनका उपयोग निम्नलिखित स्ट्रिंग की तरह मिलान स्ट्रिंग सीमा पदों का पता लगाने के लिए कर सकें:

def regex_search_ignore_space(regex, string):
    no_spaces = ''
    char_positions = []

    for pos, char in enumerate(string):
        if re.match(r'\S', char):  # upper \S matches non-whitespace chars
            no_spaces += char
            char_positions.append(pos)

    match = re.search(regex, no_spaces)
    if not match:
        return match

    # match.start() and match.end() are indices of start and end
    # of the found string in the spaceless string
    # (as we have searched in it).
    start = char_positions[match.start()]  # in the original string
    end = char_positions[match.end()]  # in the original string
    matched_string = string[start:end]  # see

    # the match WITH spaces is returned.
    return matched_string

with_spaces = 'a li on and a cat'
print(regex_search_ignore_space('lion', with_spaces))
# prints 'li on'

यदि आप आगे जाना चाहते हैं तो आप मैच ऑब्जेक्ट का निर्माण कर सकते हैं और इसके बजाय इसे वापस कर सकते हैं, इसलिए इस सहायक का उपयोग अधिक उपयोगी होगा।

और इस फ़ंक्शन के प्रदर्शन को निश्चित रूप से अनुकूलित किया जा सकता है, यह उदाहरण केवल समाधान के लिए रास्ता दिखाने के लिए है।

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