2016-10-28 16 views
7

मैं रेगेक्स सीख रहा हूं। लेकिन मैं '\ b' को समझ नहीं सकता, एक शब्द सीमा से मेल खाता हूं। इस तरह की तीन स्थितियां हैं:regex ' b' को कैसे समझें?

  1. स्ट्रिंग में पहले वर्ण से पहले, यदि पहला अक्षर एक शब्द चरित्र है।
  2. स्ट्रिंग में अंतिम वर्ण के बाद, यदि अंतिम वर्ण शब्द शब्द है।
  3. स्ट्रिंग में दो वर्णों के बीच, जहां एक शब्द चरित्र है और दूसरा शब्द वर्ण नहीं है।

मैं तीसरे situation.for उदाहरण समझ में नहीं कर सकते हैं:

var reg = /end\bend/g; 
var string = 'wenkend,end,end,endend'; 
alert(reg.test(string)) ; //false 

'\ बी' इसकी एक साइड को एक '\ w' चरित्र की आवश्यकता होती है, एक और नहीं '\ w' में चरित्र दूसरी ओर । स्ट्रिंग 'एंड, एंड' नियम से मेल खाना चाहिए, पहले अक्षर स्ट्रिंग ',' के बाद, अंतिम वर्ण स्ट्रिंग ',' से पहले, तो परिणाम क्यों त्रुटि है। क्या आप मदद कर सकते हैं, अग्रिम धन्यवाद!

============ लाइन =============

विभाजित आपकी मदद से मैं इसे समझते हैं। 'अंत, अंत' पहले 'अंत' से मेल खाता है और एक सीमा है, लेकिन अगला चरित्र ',' नहीं 'ई' है, इसलिए '/ end \ bend' गलत है।

दूसरे शब्दों में, reg '/ end \ bend/g' या अन्य समान reg हमेशा के लिए बाहर नहीं निकलते हैं। धन्यवाद फिर से

+0

'\ b' कुछ भी – Steve

+0

आपका regex' होना चाहिए/अंत \ ख पर कब्जा नहीं है, \ मोड़/g' –

+5

'\ b' एक चरित्र से मेल नहीं खाता, यह पात्रों, सीमा के बीच एक स्थान से मेल खाता है। वहां एक शब्द सीमा होने के लिए असंभव है जब '\ b' के बगल में दो वर्ण शब्द वर्ण दोनों होते हैं। रेगेक्स जिसे आप शायद सोच रहे हैं वह है// end \ wend/g' – 4castle

उत्तर

4

\b मैचों की स्थिति, एक चरित्र नहीं। तो यह regex /end\bend/g कहता है कि स्ट्रिंग end होना चाहिए। इसके बाद इसे एक शब्द चरित्र नहीं होना चाहिए, जो , है और यह मेल खाता है, लेकिन रेगेक्स इंजन स्ट्रिंग में नहीं चलता है और यह , पर रहता है। तो आपके regex में अगला अक्षर e है, और e, से मेल नहीं खाता है। तो regexp विफल रहता है। यहाँ चरण दर चरण होता है:

----------------- 
/end\bend/g, "end,end"  (match) 
    |    | 
----------------- 

/end\bend/g, "end,end"  (both regex and string position moved - match) 
    |    | 
------------------ 

/end\bend/g, "end,end"  (the previous match was zero-length, so only regex position moved - not match) 
     |   | 
0

इस अभिव्यक्ति

/(end)\b|\b(end)/g 
+0

नियमित अभिव्यक्ति कैसे काम कर रहा है इस बारे में एक स्पष्ट विचार प्राप्त करने के लिए –

+0

http का उपयोग करने का प्रयास करें://regexr.com/ –

+2

यहां लक्ष्य उन्हें मछली नहीं देना है, यह व्यक्ति को मछली को कैसे सिखाया जाता है। यह जवाब सहायक नहीं है। – 4castle

3

(सबसे) रेग्युलर एक्सप्रेशन इंजन के साथ प्रयास करें, आप कर सकते हैं मैच, कब्जा अक्षर और एक स्ट्रिंग के भीतर ज़ोर पदों।

इस उदाहरण के प्रयोजन के लिए की स्ट्रिंग

Rogue One: A Star Wars Story 

जहां (R के बाद और t के बाद जो वहाँ दो बार है,) चरित्र o मिलान करना चाहते मान लें। अब आप स्थिति निर्दिष्ट करना चाहते हैं और o से कम करना चाहते हैं केवल लोअरकेस r एस से पहले।
आप लिखने (एक सकारात्मक अग्रदर्शी के साथ):

o(?=r) 

अब जहां एक शब्द चरित्र आगे देखने के लिए चाहते हैं शून्य चौड़ाई दावे के विचार सामान्यीकरण जबकि सुनिश्चित करते हुए वहाँ कोई शब्द चरित्र है तुरंत पीछे । इससे पहले कि आप लिख सकें:

(?=\w)(?<!\w) 

एक सकारात्मक और नकारात्मक दिखने वाला, संयुक्त।हम बहुत करीब हैं :) आप केवल चारों ओर एक ही बात (पीछे एक शब्द चरित्र और नहीं एक शब्द चरित्र आगे), जो है की जरूरत है:

(?<=\w)(?!\w) 

अगर आप इन दोनों गठबंधन आपको धीरे-धीरे (मिल जाएगा बीच में |) देखें:

(?:(?=\w)(?<!\w)|(?<=\w)(?!\w)) 


कौन सा \b के बराबर है (और एक बहुत लंबे समय तक)।

Rogue One: A Star Wars Story 
# right before R 
# right after e in Rogue 
# right before O of One 
# right after e of One (: is not a word character) 
# and so on... 

a demo on regex101.com देखें: हमारी स्ट्रिंग के लिए वापस आ रहा है, यह सच है।


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

+1

एफवाईआई, [tchrist का उत्तर] (http: // stackoverflow।कॉम/ए/4215293/3832 9 70) यह भी बताता है कि "सशर्त" (वास्तव में, प्रासंगिक) शब्द सीमा व्यवहार। –

संबंधित मुद्दे