रेक्स में \ b और \ B के बीच अंतर


103

मैं नियमित अभिव्यक्ति पर एक किताब पढ़ रहा हूं और मैं इस उदाहरण के लिए आया हूं \b:

बिल्ली ने अपना भोजन पूरे कमरे में बिखेर दिया।

Regex का उपयोग करना - \bcat\bशब्द से मेल खाएगी catलेकिन नहीं catमें scattered

के लिए \Bलेखक निम्न उदाहरण का उपयोग करता है:

कृपया इसे नौ अंकों की आईडी में दर्ज करें

आपके रंग पर दिखाई देता है - कोडित पास-कुंजी।

शब्द के बीच रेगेक्स \B-\Bमैचों का उपयोग करना । दूसरी ओर का उपयोग करके और में मेल खाता है ।-color - coded\b-\b-nine-digitpass-key

हम पहले उदाहरण में कैसे \bअलग होने के लिए आते हैं catऔर दूसरे उपयोग \Bमें अलग करने के लिए -? \bदूसरे उदाहरण का उपयोग करते हुए पहले जो किया उसके विपरीत है।

कृपया मुझे अंतर बताएं।

संपादित करें: इसके अलावा, क्या कोई नया उदाहरण देकर समझा सकता है?

जवाबों:


84

आपकी सोच से भ्रम की स्थिति \bरिक्त स्थान से मेल खाती है (शायद इसलिए कि "बी" "रिक्त" का सुझाव देता है)।

\bकिसी शब्द की शुरुआत या अंत में खाली स्ट्रिंग से मेल खाता है । \Bकिसी शब्द की शुरुआत या अंत में खाली स्ट्रिंग से मेल खाता है। यहाँ कुंजी यह है कि "-" एक शब्द का हिस्सा नहीं है। इसलिए <left>-<right>मेल खाता है \b-\bक्योंकि दोनों ओर शब्द सीमाएँ हैं -। दूसरी ओर <left> - <right>(रिक्त स्थान पर ध्यान दें), डैश के दोनों ओर शब्द सीमाएँ नहीं हैं। शब्द सीमाएं एक स्थान आगे बाएं और दाएं हैं।

दूसरी ओर, जब \bcat\bशब्द सीमाएं खोजते हैं तो अधिक सहजता से व्यवहार करते हैं, और यह अपेक्षा के अनुसार "बिल्ली" से मेल खाता है।


2
हाँ, मैं वास्तव में एक रिक्त स्थान के साथ \ b भ्रामक था। हालाँकि, मैं अभी भी थोड़ा उलझन में हूँ। क्या मैं आपसे एक और उदाहरण पूछ सकता हूं?
हलचल

3
कुंजी यह है कि -एक शब्द का हिस्सा नहीं माना जाता है। इसी तरह, !एक शब्द का हिस्सा नहीं है। तो फिर से \b!\b"यूनेट! आईमॉल्ड" से मेल खाता है, लेकिन "वाह! आप हैं।" आप इस सामान को regexpal.com पर आज़मा सकते हैं
andrewdski

@andrewdski मेरे मामले में, विराम चिह्नों के लिए भी पकड़ता है ... मैंने 1987894, 3219800 पर \ b [A-Z0-9] + \ b के साथ प्रयास किया; 234567, 345261. और यह ठीक काम करता है, मैं केवल नंबर प्राप्त करता हूं
गनजैपर

1
बस जोड़ना कि regex में एक काम अक्षरों (a- z और A- Z), अंकों और "_" [अंडरस्कोर]) से बना है। बाकी सब गैर शब्द है।
Maralc

क्या कोई इस पंक्ति का विस्तार कर सकता है\B matches the empty string not at the beginning or end of a word
अरुण गौड़ा

68

\bएक शून्य-चौड़ाई शब्द सीमा है। विशेष रूप से:

एक शब्द चरित्र (कुछ भी \ w से मेल खाता) और एक गैर-शब्द चरित्र ([^ \ w] या \ W से मेल खाता कुछ भी) और साथ ही स्ट्रिंग के शुरू और / या अंत में स्थिति पर मेल खाता है और / या स्ट्रिंग में अंतिम वर्ण शब्द वर्ण हैं।

उदाहरण: .\bमैचों cमेंabc

\Bएक शून्य-चौड़ाई गैर-शब्द सीमा है। विशेष रूप से:

दो शब्द पात्रों (यानी \ w \ w के बीच की स्थिति) के साथ-साथ दो गैर-शब्द वर्णों (यानी \ W \ W) के बीच की स्थिति में मेल खाता है।

उदाहरण: \B.\Bमैचों bमेंabc

अधिक महान regex जानकारी के लिए regular-expressions.info देखें


10
+1 क्योंकि शून्य-चौड़ाई परिभाषा का एक महत्वपूर्ण हिस्सा है। यदि यह शून्य-चौड़ाई नहीं होती, तो यह पैटर्न के मिलान वाले भाग में उन शब्दों / गैर-शब्द वर्णों को भी हड़प लेता था।
बेन हॉकिंग

5
दूसरे शब्दों में, \ B, \ W और \ W के बीच या \ w और \ w के बीच के स्थान से मेल खाता है, लेकिन \ W और \ w के बीच नहीं।

1
यह जवाब "एंकर" के तहत स्टैक ओवरफ्लो रेगुलर एक्सप्रेशन एफएक्यू में जोड़ा गया है ।
aliteralmind

1
@stephenhuh string.match()रिटर्न केवल पहला मैच, जब तक आप जोड़ने के वैश्विक ध्वज g: "abc def".match(/\b./g)रिटर्न['a', ' ', 'd']
बोहेमियन

1
मुझे लगता है कि यह बेहतर जवाब है। मुझे भी स्वीकार किया जाना चाहिए क्योंकि यह भ्रम को हल करता है। यहाँ बहुत कुछ सीखना है।
वुल्फ

38

एक अलग उदाहरण के साथ:

गौर करें कि यह 'कैट' के लिए खोजा जाने वाला स्ट्रिंग और पैटर्न है:

text = "catmania thiscat thiscatmaina";

अब परिभाषाएँ,

'\ b' प्रत्येक शब्द के आरंभ या अंत में पैटर्न को ढूंढता / मिलाता है।

'\ B' प्रत्येक शब्द के आरंभ या अंत में पैटर्न को नहीं खोजता / मिलाता नहीं है।

विभिन्न मामले:

केस 1: प्रत्येक शब्द की शुरुआत में

result = text.replace(/\bcat/g, "ct");

अब, परिणाम "ctmania thiscat thiscatmaina" है

केस 2: प्रत्येक शब्द के अंत में

result = text.replace(/cat\b/g, "ct");

अब, परिणाम "कैटमैनिया थिक्ट इटकैटमैना" है

केस 3: शुरुआत में नहीं

result = text.replace(/\Bcat/g, "ct");

अब, परिणाम है "कैटमैनिया सिद्धांत इस सिद्धांत"

केस 4: अंत में नहीं

result = text.replace(/cat\B/g, "ct");

अब, परिणाम "ctmania itcat itctmaina" है

केस 5: न तो शुरुआत और न ही अंत

result = text.replace(/\Bcat\B/g, "ct");

अब, परिणाम "कैटामेनिया इक्टाट इक्ट्मैना" है

उम्मीद है की यह मदद करेगा :)


मुझे सही करें अगर मैं गलत हूं, लेकिन, अगर \ bcat \ b का उपयोग करते समय, यदि हमारी स्ट्रिंग होती, उदाहरण के लिए: "catcat is my cat" => पहला शब्द (catcat) इस शर्त पर लागू होता। नहीं?।
कोसेम

8

मेटाचैकर \ b कैरेट और डॉलर चिन्ह की तरह एक लंगर है। यह एक ऐसी स्थिति से मेल खाता है जिसे "शब्द सीमा" कहा जाता है। यह मैच जीरो-लेंथ है।

शब्द सीमा के रूप में योग्य तीन अलग-अलग पद हैं:

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

\ B \ b का नकारात्मक संस्करण है । \ B हर उस स्थिति से मेल खाता है जहाँ \ b नहीं होता है। प्रभावी रूप से, \ B दो शब्द वर्णों के बीच किसी भी स्थिति में और साथ ही दो गैर-शब्द वर्णों के बीच किसी भी स्थिति में मेल खाता है।

स्रोत: http : //www. अनियमित- expressions.info/wordboundaries.html


3

\bशब्द-सीमा से मेल खाता है। \Bगैर-शब्द-सीमाओं से मेल खाता है, और इसके बराबर है ( सुधार के लिए @Alan मूर के लिए धन्यवाद !) । दोनों शून्य-चौड़ाई वाले हैं।[^\b](?!\b)

जानकारी के लिए http://www . अनियमित- expressions.info/wordboundaries.html देखें। रीगेक्स के कई बुनियादी सवालों के लिए यह साइट बेहद उपयोगी है।


4
\Bके बराबर नहीं है [^\b]। एक चरित्र वर्ग ( [...]या [^...]), ठीक एक चरित्र की खपत है, जबकि शून्य-चौड़ाई दावे की तरह \bऔर \Bकुछ भी उपभोग नहीं करते। यदि आप \bएक चरित्र वर्ग में रखते हैं, तो यह पूरी तरह से अलग अर्थ लेता है: [\b]एक बैकस्पेस से मेल खाता है, और [^\b]किसी भी चरित्र को एक बैकस्पेस के अलावा मेल खाता है । \Bवास्तव में इसके बराबर है (?!\b)
एलन मूर

@Alan धन्यवाद, आप पूरी तरह से सही हैं - मैंने आज सुबह नहीं जगाया था जब मैंने ऐसा लिखा था। फिक्स्ड।
मैट बॉल

4
... लेकिन कोई भी बैकस्पेस का मिलान क्यों करना चाहेगा, यह मुझसे परे है। : D
एलन मूर

1

एक स्ट्रिंग लेने दें जैसे:

XIX IXI XX XI II IIXX XXII II XX -X X- XI IX -X- -IX -XI IX- XI- X_X _X-

नोट: अंडरस्कोर (_) इस मामले में एक विशेष चरित्र नहीं माना जाता है।

  1. /\bX\b/g एक विशेष चरित्र या सफेद स्थान के साथ शुरू और समाप्त होना चाहिए

XIX IXI XX X I II IIXX XXII II X - X - X X - X- I I- X - X - -I- X - X- I I- X - X - I- X_X _X-


  1. /\bX/g एक विशेष चरित्र या सफेद अंतरिक्ष के साथ शुरू होना चाहिए

एक्स नौवीं IXI एक्स एक्स एक्स मैं द्वितीय IIXX एक्स बारहवीं द्वितीय एक्स - एक्स - एक्स एक्स - एक्स मैं नौवीं - एक्स - -I- एक्स - एक्स मैं नौवीं - एक्स -I- एक्स _X _X-


  1. /X\b/g एक विशेष चरित्र या सफेद अंतरिक्ष के साथ समाप्त होना चाहिए

ग्यारहवीं एक्स IXI एक्स एक्स एक्स मैं द्वितीय IIx एक्स XXII द्वितीय एक्स - एक्स - एक्स एक्स - एक्स मैं I- एक्स - एक्स - -I- एक्स - एक्स मैं I- एक्स - एक्स -I- X_ एक्स _ एक्स -


  1. /\BX\B/g
    चाहिए नहीं शुरू करते हैं और नहीं विशेष वर्ण या सफेद अंतरिक्ष के साथ समाप्त

XIX I X I XX XI II II X X X X II II XX- X X- XI IX -X- -XI-II- XI- X_X _X-


  1. /\BX/gएक विशेष चरित्र या सफेद अंतरिक्ष से शुरू नहीं होना चाहिए

ग्यारहवीं एक्स मैं एक्स मैं एक्स एक्स इलेवन द्वितीय द्वितीय XX एक्स एक्स द्वितीय द्वितीय XX -X एक्स इलेवन नौवीं -X- -IX -XI IX- XI- X_ एक्स _ एक्स -


  1. /X\B/gएक विशेष चरित्र या सफेद अंतरिक्ष के साथ समाप्त नहीं होना चाहिए

X IX I X I X X XI II II X X XX II II XX- X X- XI IX -X- -XI-II- XI- X _X _X-


  1. /\bX\B/gशुरू होना चाहिए और एक विशेष चरित्र या सफेद अंतरिक्ष के साथ समाप्त नहीं होना चाहिए

एक्स नौवीं IXI एक्स एक्स इलेवन द्वितीय द्वितीय एक्स एक्स एक्स बारहवीं द्वितीय XX -X एक्स इलेवन नौवीं -X- -IX -XI IX- XI- एक्स _X _X-


  1. /\BX\b/gचाहिए नहीं शुरू करते हैं और विशेष वर्ण या सफेद स्पेस के साथ समाप्त होना चाहिए

XI X IXI X X XI II IIX X XXII II XX-X X- XI IX -X- -IX -XI IX- XI- X_ X _ X -


1

स्रोत © कॉपीराइट RexEgg.com

शब्द सीमा: \ b *

शब्द सीमा \ b उन स्थितियों से मेल खाता है जहाँ एक पक्ष एक शब्द वर्ण है (आमतौर पर एक अक्षर, अंक या अंडरस्कोर - लेकिन इंजनों में भिन्नता के लिए नीचे देखें) और दूसरा पक्ष शब्द वर्ण नहीं है (उदाहरण के लिए, यह शुरुआत हो सकती है स्ट्रिंग या एक अंतरिक्ष चरित्र)।

इसलिए, रेगेक्स \ bcat \ b, बिल्ली को एक काली बिल्ली से मिलाएगा, लेकिन यह इसे कैटेटोनिक, टॉमकैट या प्रमाण पत्र में नहीं मिलाएगा। सीमाओं में से एक को हटाकर, \ bcat कैटफ़िश में बिल्ली से मेल खाएगा, और cat \ b टॉमकैट में बिल्ली से मेल खाएगा, लेकिन इसके विपरीत नहीं। दोनों, निश्चित रूप से, अपने दम पर बिल्ली का मुकाबला करेंगे।

शब्द-सीमा नहीं: \ B

\ B उन सभी स्थितियों से मेल खाता है जहाँ \ b मेल नहीं खाता। इसलिए, यह मेल खाता है:

✽ जब न तो कोई पक्ष वर्ण होता है, उदाहरण के लिए स्ट्रिंग में किसी भी स्थिति में $ = (@ -% ++) (स्ट्रिंग की शुरुआत और अंत सहित)

✽ जब दोनों पक्ष एक वर्ण वर्ण होते हैं, उदाहरण के लिए एच और आई के बीच हाय!

यह बहुत उपयोगी नहीं लग सकता है, लेकिन कभी-कभी \ B बस वही होता है जो आप चाहते हैं। उदाहरण के लिए,

Surrounded \ Bcat \ B पूरी तरह से शब्द पात्रों से घिरा हुआ मिलेगा, जैसा कि प्रमाण पत्र में है, लेकिन न तो अपने दम पर और न ही शब्दों की शुरुआत या अंत में।

✽ cat \ B में बिल्ली को प्रमाणपत्र और कैटफ़िश दोनों मिलेंगे, लेकिन न तो टॉमकैट में और न ही अपने आप।

✽ \ Bcat को प्रमाणपत्र और टॉमकैट दोनों में बिल्ली मिलेगी, लेकिन न तो कैटफ़िश में और न ही अपने दम पर।

✽ \ Bcat | बिल्ली \ B को एंबेडेड स्थिति में बिल्ली मिलेगी, जैसे प्रमाण पत्र, कैटफ़िश या टॉमकैट में, लेकिन अपने दम पर नहीं।


1

\ b का उपयोग शब्द सीमा के रूप में किया जाता है

word = "categorical cat"

उपरोक्त शब्द में सभी "बिल्ली" खोजें

बिना बी

re.findall(r'cat',word)
['cat', 'cat']

with \ b

re.findall(r'\bcat\b',word)
['cat']

0

\Bहै \b जैसे नकारात्मक \b

pass-keyयहाँ कोई शब्द सीमा नहीं है -इसलिए यह \Bआपके पहले उदाहरण में मेल खाता है , बिल्ली के पास शब्द सीमा है इसलिए यह मेल खाता है\b

इसी तरह के नियम दूसरों के लिए भी लागू होते हैं। \Wकी नकारात्मक \w \UPPER CASEहै\LOWER CASE

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