ความแตกต่างระหว่าง \ b และ \ B ใน regex


107

ฉันกำลังอ่านหนังสือเกี่ยวกับการแสดงออกปกติและฉันเจอตัวอย่างนี้สำหรับ\b:

แมวกระจายอาหารของเขาไปทั่วห้อง

ใช้ regex - \bcat\bจะตรงกับคำว่าcatแต่ไม่ได้อยู่ในcatscattered

สำหรับ\Bผู้เขียนใช้ตัวอย่างต่อไปนี้:

โปรดป้อนรหัสเก้าหลักตามนั้น

ปรากฏบนสีของคุณ - รหัสรหัสผ่าน

ใช้ regex \B-\Bการแข่งขันระหว่างคำว่า- color - codedใช้\b-\bบนมืออื่น ๆ ที่ตรงกับ-ในและnine-digitpass-key

วิธีการมาในตัวอย่างแรกที่เราใช้\bในการแยกcatและการใช้งานที่สอง\Bจะแยก-? การใช้\bในตัวอย่างที่สองจะตรงกันข้ามกับสิ่งที่ทำก่อนหน้านี้

กรุณาอธิบายความแตกต่างให้ฉัน

แก้ไข: ใครช่วยอธิบายด้วยตัวอย่างใหม่ได้ไหม

คำตอบ:


89

ความสับสนเกิดจากความคิดของคุณ\bตรงกับช่องว่าง (อาจเป็นเพราะ "b" แนะนำ "ว่าง")

\bตรงกับสตริงที่ว่างเปล่าที่จุดเริ่มต้นหรือจุดสิ้นสุดของคำ \Bจับคู่สตริงว่างที่ไม่อยู่ที่จุดเริ่มต้นหรือจุดสิ้นสุดของคำ ที่สำคัญคือ "-" ไม่ใช่ส่วนหนึ่งของคำ ดังนั้น<left>-<right>ตรงเพราะมีขอบเขตของคำที่ด้านข้างของทั้ง\b-\b -ในทางกลับกันสำหรับ<left> - <right>(สังเกตช่องว่าง) ไม่มีขอบเขตของคำที่ด้านใดด้านหนึ่งของเส้นประ คำว่าขอบเขตคือช่องว่างอีกหนึ่งช่องทางซ้ายและขวา

ในทางกลับกันเมื่อค้นหา\bcat\bขอบเขตของคำจะทำงานโดยสัญชาตญาณมากขึ้นและตรงกับ "แมว" ตามที่คาดไว้


2
ใช่ฉันสับสน \ b กับช่องว่าง อย่างไรก็ตามฉันยังรู้สึกสับสนเล็กน้อย ฉันขออีกหนึ่งตัวอย่างได้ไหม
stirredo

3
ที่สำคัญคือ-ไม่ถือว่าเป็นส่วนหนึ่งของคำ ในทำนองเดียวกัน!ไม่ได้เป็นส่วนหนึ่งของคำ อีกครั้ง\b!\bจับคู่ "uunet! iamold" แต่ไม่ใช่ "ว้าว! คุณเป็น" คุณสามารถลองสิ่งนี้ออกที่regexpal.com
andrewdski

@andrewdski ในกรณีของฉัน \ b จับเครื่องหมายวรรคตอนด้วย ... ฉันลองใช้ \ b [A-Z0-9] + \ b เมื่อ 1987894, 3219800; 234567, 345261 และใช้งานได้ดีฉันได้รับตัวเลขเท่านั้น
gunzapper

1
เพียงแค่เพิ่มว่างานใน regex ประกอบด้วยตัวอักษร (a– z และ A– Z) ตัวเลขและ“ _” [ขีดล่าง]) ทุกสิ่งทุกอย่างไม่ใช่คำพูด
Maralc

ใครช่วยอธิบายบรรทัดนี้\B matches the empty string not at the beginning or end of a word
อรุณ

69

\bคือขอบเขตคำที่มีความกว้างเป็นศูนย์ โดยเฉพาะ:

จับคู่ที่ตำแหน่งระหว่างอักขระคำ (อะไรก็ได้ที่จับคู่ด้วย \ w) และอักขระที่ไม่ใช่คำ (อะไรก็ตามที่จับคู่โดย [^ \ w] หรือ \ W) รวมทั้งที่จุดเริ่มต้นและ / หรือจุดสิ้นสุดของสตริงถ้าตัวแรก และ / หรืออักขระสุดท้ายในสตริงเป็นอักขระคำ

ตัวอย่าง: .\bตรงกับcในabc

\Bคือขอบเขตที่ไม่ใช่คำที่มีความกว้างเป็นศูนย์ โดยเฉพาะ:

จับคู่ที่ตำแหน่งระหว่างอักขระคำสองตัว (เช่นตำแหน่งระหว่าง \ w \ w) และที่ตำแหน่งระหว่างอักขระที่ไม่ใช่คำสองตัว (เช่น \ W \ W)

ตัวอย่าง: \B.\Bตรงกับbในabc

ดูregular-expressions.infoสำหรับข้อมูล regex ที่ยอดเยี่ยมเพิ่มเติม


10
+1 เนื่องจากความกว้างเป็นศูนย์เป็นส่วนสำคัญของคำจำกัดความ ถ้าไม่ใช่ความกว้างเป็นศูนย์ก็จะดึงอักขระคำ / ไม่ใช่คำเหล่านั้นมาไว้ในส่วนที่ตรงกันของรูปแบบ
Ben Hocking

5
กล่าวอีกนัยหนึ่ง \ B จะจับคู่จุดระหว่าง \ W และ \ W หรือระหว่าง \ w และ \ w แต่ไม่ใช่ระหว่าง \ W และ \ w

1
คำตอบนี้ถูกเพิ่มเข้าไปในคำถามที่พบบ่อยเกี่ยวกับนิพจน์ทั่วไปของStack Overflowภายใต้ "Anchors"
aliteralmind

1
@stephenhuh string.match()ส่งคืนเฉพาะนัดแรกเว้นแต่คุณจะเพิ่มธงสากลg : "abc def".match(/\b./g)ส่งกลับ['a', ' ', 'd']
โบฮีเมียน

1
ผมว่าเป็นคำตอบที่ดีกว่า ฉันควรเป็นคนที่ได้รับการยอมรับเพราะมันช่วยแก้ความสับสนได้ เรียนรู้อีกมากมายที่นี่
Wolf

43

ด้วยตัวอย่างอื่น:

พิจารณาว่านี่คือสตริงและรูปแบบที่จะค้นหาคือ 'cat':

text = "catmania thiscat thiscatmaina";

ตอนนี้คำจำกัดความ

'\ b'ค้นหา / จับคู่รูปแบบที่จุดเริ่มต้นหรือจุดสิ้นสุดของแต่ละคำ

'\ B'ไม่พบ / ตรงกับรูปแบบที่จุดเริ่มต้นหรือจุดสิ้นสุดของแต่ละคำ

กรณีต่างๆ:

กรณีที่ 1: ที่จุดเริ่มต้นของแต่ละคำ

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

ตอนนี้ผลลัพธ์คือ "ctmania thiscat thiscatmaina"

กรณีที่ 2: ในตอนท้ายของแต่ละคำ

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

ตอนนี้ผลลัพธ์คือ "catmania thisct thiscatmaina"

กรณีที่ 3: ไม่ได้อยู่ในช่วงเริ่มต้น

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

ตอนนี้ผลลัพธ์คือ "catmania thisct thisctmaina"

กรณีที่ 4: ไม่ใช่ท้ายที่สุด

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

ตอนนี้ผลลัพธ์คือ "ctmania thiscat thisctmaina"

กรณีที่ 5: ไม่มีจุดเริ่มต้นหรือจุดสิ้นสุด

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

ตอนนี้ผลลัพธ์คือ "catmania thiscat thisctmaina"

หวังว่านี่จะช่วยได้ :)


โปรดแก้ไขฉันหากฉันผิด แต่เมื่อใช้ \ bcat \ b หากสตริงของเราเป็นเช่น: "catcat is my cat" => คำแรก (catcat) จะใช้กับเงื่อนไขนี้ ไม่?.
Kosem

@Kosem นี่เป็นคำถามที่ดีและทำให้ฉันเรียนได้\bดีขึ้น สิ่งที่ฉันเข้าใจหลังจากนั้นคือสาเหตุที่คำแรกไม่ตรงกันคือเมื่อ\bcat\bคุณพูดว่าแมวต้องล้อมรอบด้วยขอบเขตของคำ catcatเริ่มต้นด้วยขอบเขตคำcatพบชั้นในตัวแรก[เรายังคงเคารพ regex] แต่หาง\bก็กำหนดว่าหลังจากคำแรกtในcatcatนั้นควรมีขอบเขตคำอื่นซึ่งไม่เป็นเช่นนั้นเพราะตัวที่สองcในcatcatเป็นอักขระคำอื่น [= word ต่อไป] เหตุผลที่คล้ายกันในการข้ามวินาทีcatของcatcat
Antonino

9

metacharacter \ b เป็นจุดยึดเช่นเครื่องหมายคาเร็ตและเครื่องหมายดอลลาร์ ตรงกับตำแหน่งที่เรียกว่า "ขอบเขตคำ" การจับคู่นี้มีความยาวเป็นศูนย์

มีสามตำแหน่งที่แตกต่างกันที่มีคุณสมบัติเป็นขอบเขตของคำ:

  • ก่อนอักขระตัวแรกในสตริงถ้าอักขระตัวแรกเป็นอักขระคำ
  • หลังจากอักขระสุดท้ายในสตริงถ้าอักขระสุดท้ายเป็นอักขระคำ
  • ระหว่างอักขระสองตัวในสตริงโดยที่ตัวหนึ่งเป็นอักขระคำและอีกตัวไม่ใช่อักขระคำ

\ B เป็นรุ่นเมื่อตะกี้ของ \ข \ B จับคู่ทุกตำแหน่งโดยที่ \ b ไม่มี อย่างมีประสิทธิภาพ \ B จับคู่ที่ตำแหน่งใดก็ได้ระหว่างอักขระคำสองตัวและที่ตำแหน่งใดก็ได้ระหว่างอักขระที่ไม่ใช่คำสองตัว

ที่มา: http://www.regular-expressions.info/wordboundaries.html


3

\bตรงกับขอบเขตคำ \Bตรงกับที่ไม่ใช่คำขอบเขตและเทียบเท่ากับ(ขอบคุณ@Alan มัวร์สำหรับการแก้ไข!) ทั้งสองมีความกว้างเป็นศูนย์[^\b](?!\b)

ดูรายละเอียดได้ที่http://www.regular-expressions.info/wordboundaries.html ไซต์นี้มีประโยชน์อย่างยิ่งสำหรับคำถามพื้นฐานเกี่ยวกับ regex


4
\Bคือไม่ได้[^\b]เทียบเท่ากับ คลาสอักขระ ( [...]หรือ[^...]) ใช้อักขระหนึ่งตัวในขณะที่การยืนยันความกว้างเป็นศูนย์ชอบ\bและ\Bไม่ใช้อะไรเลย หากคุณใส่\bคลาสอักขระจะมีความหมายที่แตกต่างกันอย่างสิ้นเชิง: [\b]จับคู่แบ็กสเปซและ[^\b]จับคู่อักขระใด ๆยกเว้นแบ็กสเปซ \Bเทียบเท่ากับ(?!\b).
Alan Moore

@Alan ขอบคุณคุณถูกต้องสมบูรณ์ - เช้านี้ฉันยังไม่ตื่นเมื่อฉันเขียนสิ่งนั้น แก้ไขแล้ว.
Matt Ball

4
... แต่ทำไมใคร ๆ ก็อยากจับคู่แบ็คสเปซมากกว่าฉัน : D
Alan Moore

2

\ b ใช้เป็นขอบเขตของคำ

word = "categorical cat"

ค้นหา "แมว" ทั้งหมดในคำด้านบน

ไม่มี \ b

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

ด้วย \ b

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

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 ควรขึ้นต้นด้วยอักขระพิเศษหรือ Space สีขาว

X IX IXI X X X I II IIXX X XII II X - X - X X - X -I I- X - X - -I- X - X -I I- X - X -I- X _X _X-


  1. /X\b/g ควรลงท้ายด้วยอักขระพิเศษหรือ Space สีขาว

XI X IXI X X X I II IIX X XXII II X - X - X X - X -I I- X - X - -I- X - X -I I- X - X -I- X_ X _ X -


  1. /\BX\B/g
    ไม่ควรขึ้นต้นและไม่ลงท้ายด้วยอักขระพิเศษหรือ Space สีขาว

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


  1. /\BX/gไม่ควรขึ้นต้นด้วยอักขระพิเศษหรือ Space สีขาว

XI X I X I X X XI II II XX X X II II XX -X X- XI IX -X- -IX -XI IX- XI- X_ X _ X -


  1. /X\B/gไม่ควรลงท้ายด้วยอักขระพิเศษหรือ Space สีขาว

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


  1. /\bX\B/gควรขึ้นต้นและไม่ลงท้ายด้วยอักขระพิเศษหรือ Space สีขาว

X IX IXI X X XI II II X X X XII II XX -X X- XI IX -X- -IX -XI IX- XI- X _X _X-


  1. /\BX\b/gไม่ควรขึ้นต้นและควรลงท้ายด้วยอักขระพิเศษหรือ Space สีขาว

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 จะจับคู่ตำแหน่งโดยที่ด้านหนึ่งเป็นอักขระคำ (โดยปกติจะเป็นตัวอักษรตัวเลขหรือขีดล่าง แต่ดูรูปแบบต่างๆในเอ็นจิ้นด้านล่าง) และอีกด้านหนึ่งไม่ใช่อักขระของคำ (ตัวอย่างเช่นอาจเป็นจุดเริ่มต้นของ สตริงหรืออักขระช่องว่าง)

ดังนั้น regex \ bcat \ b จะจับคู่ cat กับแมวดำ แต่จะไม่ตรงกับ catatonic, tomcat หรือใบรับรอง การลบหนึ่งในขอบเขต \ bcat จะจับคู่แมวในปลาดุกและ cat \ b จะจับคู่แมวในแมวตัวผู้ แต่ไม่ใช่ในทางกลับกัน แน่นอนว่าทั้งคู่จะจับคู่แมวด้วยตัวของมันเอง

ไม่ใช่คำ - ขอบเขต: \ B

\ B จับคู่ทุกตำแหน่งโดยที่ \ b ไม่ตรงกัน ดังนั้นจึงตรงกับ:

✽เมื่อไม่มีด้านใดเป็นอักขระคำตัวอย่างเช่นที่ตำแหน่งใด ๆ ในสตริง $ = (@ -% ++) (รวมทั้งจุดเริ่มต้นและจุดสิ้นสุดของสตริง)

✽เมื่อทั้งสองด้านเป็นอักขระคำตัวอย่างเช่นระหว่างตัว H และ i ใน Hi!

สิ่งนี้อาจดูเหมือนไม่มีประโยชน์มากนัก แต่บางครั้ง \ B ก็เป็นสิ่งที่คุณต้องการ ตัวอย่างเช่น

✽ \ Bcat \ B จะพบแมวล้อมรอบด้วยอักขระคำเหมือนในใบรับรอง แต่จะไม่พบในตัวมันเองหรือที่จุดเริ่มต้นหรือจุดสิ้นสุดของคำ

✽ cat \ B จะพบแมวทั้งในใบรับรองและปลาดุก แต่ไม่พบในแมวตัวผู้หรือของมันเอง

✽ \ Bcat จะพบแมวทั้งในใบรับรองและแมวตัวผู้ แต่ไม่พบในปลาดุกหรือในตัวมันเอง

✽ \ Bcat | cat \ B จะพบแมวในสถานการณ์ที่ฝังตัวเช่นในใบรับรองปลาดุกหรือแมวตัวผู้ แต่ไม่พบในตัวมันเอง


0

\Bจะไม่ได้ \bเช่นเชิงลบ \b

pass-keyที่นี่ไม่มีคำว่าขอบเขตข้าง-ดังนั้นจึงตรงกับ\Bในตัวอย่างแรกของคุณมีคำว่าขอบเขตข้าง cat เพื่อให้ตรงกัน\b

กฎที่คล้ายกันใช้กับผู้อื่นด้วย \Wเป็นลบ\w \UPPER CASEเป็นลบของ\LOWER CASE

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.