Regex किसी भी क्रम में दो नामों से युक्त स्ट्रिंग से मेल खाता है


180

मैं तार्किक और regex में की जरूरत है।

कुछ इस तरह

जैक और जेम्स

निम्नलिखित तार से सहमत हैं

  • 'हाय जैक यहाँ जेम्स है '

  • 'हाय जेम्स यहाँ जैक है '


1
संभावित डुप्लिकेट: mulitple-words-in-any-order-use-regex
एंडरसन ग्रीन

@AndersonGreen, प्रश्न समय से पहले बंद कर दिया गया था। जवाबों की भारी कमी है क्योंकि वे समाधान व्यवहार्य नहीं हैं क्योंकि अधिकांश रेगेक्स लुकअराउंड और मोड क्वांटिफायर को नहीं पहचानते हैं । मेरा मानना ​​है कि क्वांटिफायर सवाल पूछे जाने के बिंदु पर मौजूद था।
XPMai

जवाबों:


261

आप लुकरॉइड्स का उपयोग करके चेक कर सकते हैं :

^(?=.*\bjack\b)(?=.*\bjames\b).*$

झसे आज़माओ।

इस दृष्टिकोण का लाभ है कि आप आसानी से कई शर्तों को निर्दिष्ट कर सकते हैं।

^(?=.*\bjack\b)(?=.*\bjames\b)(?=.*\bjason\b)(?=.*\bjules\b).*$

18
क्या कोई व्यक्ति थोड़ा और विस्तार से बताएगा कि यह उदाहरण कैसे काम करता है?
bjmc

2
vimवाक्य रचना: ^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$या\v^(.*<jack>)@=(.*<james>)@=.*$
mykhal

क्या किसी को पता है कि यह (जावास्क्रिप्ट में कम से कम) क्यों टूटेगा जब मैं '#' से शुरू होने वाले तारों की खोज करने की कोशिश करूंगा? ^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$मेल करने में विफल रहता है blah #tgif blah #friday blahलेकिन ^(?=.*\bfriday\b)(?=.*\btgif\b).*$ठीक काम करता है।
btleffler

2
\bयहाँ क्या मतलब है?
वरुणअगव २६'१६

1
@VarunAgw शब्द सीमाregular-expressions.info/refwordboundaries.html
Alin Purcaru

106

प्रयत्न:

james.*jack

यदि आप एक ही समय में दोनों चाहते हैं, तो orउन्हें:

james.*jack|jack.*james

1
स्वीकृत जवाब ने काम किया। यह भी पूरी तरह से मेरे लिए काम किया। दृश्य स्टूडियो में कोड खोजने के लिए 'परिणाम खोजें'।
दही

1
यह मेरे लिए काम करता है और स्वीकृत उत्तर की तुलना में अधिक संक्षिप्त और समझने में आसान है!
कुमार मनीष

1
मुझे एक ऐसे समाधान की आवश्यकता थी जिसमें केवल दो नामों का मेल हो, इसलिए यह उत्तर उस मामले के लिए अधिक संक्षिप्त है। लेकिन स्वीकृत उत्तर 2 से परे अधिक संक्षिप्त हो जाता है क्योंकि "या" की संख्या तथ्यात्मक रूप से बढ़ जाती है। 3 नामों के लिए 6 "या" s, 4 नाम 24 "या" s, आदि होंगे
WileCau

मैं इसे आलसी बनाने की सिफारिश करूंगा james.*?jack|jack.*?james। यह बड़े ग्रंथों पर मदद करेगा।
जेकिस

42

कमांड की व्याख्या जो मैं लिखने जा रहा हूं : -

. किसी भी चरित्र का मतलब है, अंक के स्थान पर आ सकता है।

* मतलब शून्य या उससे अधिक घटित होने वाली घटनाएँ, जो पिछले में लिखी गई हैं।

|का अर्थ है 'या'

इसलिए,

james.*jack

खोज करेंगे james , तो चरित्र के किसी भी संख्या तक jackआता है।

चूंकि आप jack.*jamesया तो चाहते हैंjames.*jack

इसलिए कमांड :

jack.*james|james.*jack

7
एक साइड नोट के रूप में - आप @ icyrock के उत्तर को भी संपादित कर सकते हैं (जो कि आपके जैसा ही है, सिर्फ 6 साल पहले), आपका स्पष्टीकरण अपने आप ही बहुत उपयोगी है।
WoJ

2
इस उत्तर के लिए धन्यवाद, मुझे हालांकि यह इंगित करने की आवश्यकता है कि VSCode खोज में, आपका उत्तर जैक। * जेम्स | जेम्स। * जैक 'के बीच रिक्त स्थान ले जाएगा ' (या) खोज के दौरान विचार में प्रतीक। जैक। * जेम्स | जेम्स। * जैक काम करता है और रिक्त स्थान की तलाश नहीं करता है
jgritten

2
यदि $ _explanation === "भयानक" $ $ THUMBS_UP ENDIF;
सैयद अकील



2

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

उदाहरण के लिए,

/.*jack\&.*james

किसी भी क्रम में jackऔर james, युक्त एक रेखा से मेल खाएगा ।

उपयोग के बारे में अधिक जानकारी के लिए यह उत्तर देखें । मैं किसी भी अन्य रेगेक्स स्वाद से अवगत नहीं हूं जो ब्रांचिंग को लागू करता है; ऑपरेटर भी नियमित अभिव्यक्ति विकिपीडिया प्रविष्टि पर प्रलेखित नहीं है ।


2

विधि 1: एक jackऔर एकjames

बस के मामले में, दो jackया दो jamesकी अनुमति नहीं होगी, केवल एक jackऔर एक jamesवैध होगा, हम संभवतः एक अभिव्यक्ति के समान डिजाइन कर सकते हैं:

^(?!.*\bjack\b.*\bjack\b)(?!.*\bjames\b.*\bjames\b)(?=.*\bjames\b)(?=.*\bjack\b).*$

यहां, हम इन कथनों का उपयोग करते हुए उन उदाहरणों को बाहर करेंगे:

(?!.*\bjack\b.*\bjack\b)

तथा,

(?!.*\bjames\b.*\bjames\b)

RegEx डेमो 1

हम यह भी सरल कर सकते हैं कि,

^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$

RegEx डेमो 2


यदि आप अभिव्यक्ति को सरल / संशोधित / संशोधित करना चाहते हैं, तो इसे regex101.com के ऊपरी दाएँ पैनल पर समझाया गया है । यदि आप चाहें, तो आप इस लिंक में भी देख सकते हैं कि यह कुछ नमूना आदानों के साथ कैसे मेल खाता है।


RegEx सर्किट

jex.im नियमित अभिव्यक्ति की कल्पना करता है:

यहां छवि विवरण दर्ज करें

परीक्षा

const regex = /^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$/gm;
const str = `hi jack here is james
hi james here is jack
hi james jack here is jack james
hi jack james here is james jack
hi jack jack here is jack james
hi james james here is james jack
hi jack jack jack here is james
`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}


विधि 2: विशिष्ट क्रम में एक jackऔर एकjames

इसे पहले डिजाइन भी किया जा सकता है james पिछले jackहै, तो निम्न के समान:

^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b.*\bjack\b).*$

RegEx डेमो 3

और इसके विपरीत:

^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjack\b.*\bjames\b).*$

RegEx डेमो 4


0

आप रेगेक्स की क्वांटिफायर सुविधा का उपयोग कर सकते हैं क्योंकि lookaroundहर समय समर्थित नहीं हो सकता है।

(\b(james|jack)\b.*){2,}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.