रेगेक्स: "स्पेस या स्ट्रिंग की शुरुआत" और "स्पेस या स्ट्रिंग का अंत" निर्दिष्ट करें


127

कल्पना करें कि आप "स्टैकओवरफ़्लो" से मेल खाने की कोशिश कर रहे हैं।

आप निम्नलिखित चाहते हैं:

 this is stackoverflow and it rocks [MATCH]

 stackoverflow is the best [MATCH]

 i love stackoverflow [MATCH]

 typostackoverflow rules [NO MATCH]

 i love stackoverflowtypo [NO MATCH]

मुझे पता है कि स्टैकओवरफ़्लो को कैसे पार्स किया जाए अगर इसका उपयोग करने वाले दोनों साइटों पर रिक्त स्थान है:

/\s(stackoverflow)\s/

एक स्ट्रिंग की शुरुआत या अंत में अगर इसके साथ:

/^(stackoverflow)\s/

/\s(stackoverflow)$/

लेकिन आप एक नियमित अभिव्यक्ति का उपयोग करके "स्पेस या एंड ऑफ़ स्ट्रिंग" और "स्पेस या स्ट्रिंग ऑफ़ स्टार्ट" कैसे निर्दिष्ट करते हैं?

जवाबों:


172

आप निम्न में से किसी का उपयोग कर सकते हैं:

\b      #A word break and will work for both spaces and end of lines.
(^|\s)  #the | means or. () is a capturing group. 


/\b(stackoverflow)\b/

इसके अलावा, यदि आप अपने मैच में स्थान शामिल नहीं करना चाहते हैं, तो आप लुकबाइंड / आहद का उपयोग कर सकते हैं।

(?<=\s|^)         #to look behind the match
(stackoverflow)   #the string you want. () optional
(?=\s|$)          #to look ahead.

8
\bएक शून्य-चौड़ाई का दावा है; यह कभी किसी पात्र का उपभोग नहीं करता है। इसे एक लुक में लपेटने की आवश्यकता नहीं है।
एलन मूर

2
ध्यान दें कि सबसे regexp कार्यान्वयन में, \bहै केवल मानक ASCII , कहने के लिए, कोई यूनिकोड समर्थन है। यदि आपको यूनिकोड शब्दों से मेल खाना है, तो आपके पास इसके बजाय इसका उपयोग करने के अलावा कोई विकल्प नहीं है: stackoverflow.com/a/6713327/1329367
Mahn

4
समूह चयन को मैच से बाहर करने का आसान तरीका है(?:^|\s)
user2426679

7
अजगर के लिए, के (?<=\s|^)साथ बदलें (?:(?<=\s)|(?<=^))। अन्यथा, आप प्राप्त करते हैंerror: look-behind requires fixed-width pattern
user2426679

4
\bअन्य पात्रों पर विचार करेंगे - जैसे कि " ." के रूप में शब्द तोड़ने वाले, प्रश्नकर्ता विशेष रूप से कहा है, जबकि "अंतरिक्ष"। @ गोर्डी का समाधान बेहतर लगता है।
मिखाइल टी।

65

(^|\s)स्पेस या स्ट्रिंग की शुरुआत और ($|\s)स्पेस या स्ट्रिंग के अंत से मेल खाएगा । एक साथ यह है:

(^|\s)stackoverflow($|\s)

4
यह केवल वही है जो मेरे लिए काम करता है। शुक्रिया @gordy
robsonrosa

2
यदि आप प्रतिस्थापित करने के लिए इस पैटर्न का उपयोग करते हैं, तो पैटर्न के साथ प्रतिस्थापित करके रिक्तियों को प्रतिस्थापित परिणाम में रखना याद रखें $1string$2
महन

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

18

यहाँ मैं क्या उपयोग होगा:

 (?<!\S)stackoverflow(?!\S)

दूसरे शब्दों में, "स्टैकओवरफ़्लो" से मेल खाता है अगर यह एक गैर-व्हाट्सएप चरित्र से पहले नहीं है और गैर-व्हाट्सएप चरित्र द्वारा पीछा नहीं किया गया है।

यह "स्पेस-ऑर-एंकर" दृष्टिकोण की तुलना में neater (IMO) है, और यह नहीं मानता है कि स्ट्रिंग शुरू होती है और शब्द वर्णों के साथ समाप्त होती है जैसे \bदृष्टिकोण करता है।


1
इसका उपयोग करने के बारे में अच्छी व्याख्या। मैं इसे चुना है, लेकिन परीक्षण किया जा रहा स्ट्रिंग हमेशा एक पंक्ति है।
अनाम-एक

7

\b शब्द सीमाओं (वास्तव में किसी भी वर्ण से मेल खाते हुए) पर मेल खाते हैं, इसलिए निम्नलिखित को वह करना चाहिए जो आप चाहते हैं:

\bstackoverflow\b

पायथन के लिए यह इसे एक कच्ची स्ट्रिंग , जैसेmystr = r'\bstack overflow\b'
एक्यूमेनस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.