ความแตกต่างระหว่าง \ w และ \ b ​​อักขระเมตานิพจน์ทั่วไป


142

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


11
\wหมายถึงตัวอักษรคำในขณะที่\bหมายถึงขอบเขตของคำระหว่างตัวอักษรคำและตัวละครที่ไม่ใช่คำ พวกเขาไม่เหมือนกัน
BoltClock

คำตอบ:


259

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

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

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

ใส่เพียง: \bช่วยให้คุณสามารถที่จะดำเนินการ"ทั้งคำเท่านั้น"\bword\bค้นหาโดยใช้การแสดงออกปกติในรูปแบบของ "ตัวอักษรคำ"เป็นตัวละครที่สามารถนำมาใช้ในรูปแบบคำ ทุกตัวอักษรที่ไม่ได้เป็น"ตัวอักษรคำว่า"มี"อักขระที่ไม่ใช่คำว่า"

ในทุกรสชาติตัวละคร[a-zA-Z0-9_]เป็นตัวอักษรคำ \wเหล่านี้ยังมีการจับคู่โดยตัวอักษรระดับสั้นมือ รสชาติที่แสดง"ascii"สำหรับขอบเขตของคำในการเปรียบเทียบกลิ่นจะรับรู้เฉพาะสิ่งเหล่านี้เป็นอักขระคำ

\wย่อมาจาก"ตัวอักษรคำว่า"[A-Za-z0-9_]มักจะ สังเกตเห็นการรวมของขีดล่างและตัวเลข

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

\Wสั้นสำหรับรุ่นเมื่อตะกี้ของ[^\w]\w


21

\wจับคู่อักขระคำ \bเป็นการจับคู่แบบความกว้างศูนย์ที่จับคู่อักขระตำแหน่งที่มีอักขระคำอยู่ด้านหนึ่งและสิ่งที่ไม่ใช่อักขระคำอีกด้านหนึ่ง (ตัวอย่างของสิ่งที่ไม่ใช่ตัวอักษรรวมถึงช่องว่างจุดเริ่มต้นและจุดสิ้นสุดของสตริง ฯลฯ )

\wการแข่งขันa, b, c, d, eและfใน"abc def"
\bการแข่งขัน (ศูนย์ความกว้าง) ตำแหน่งก่อนaหลังจากcก่อนdและหลังfใน"abc def"

ดู: http://www.regular-expressions.info/reference.html/


3
มันถูกต้องมากกว่าที่จะบอกว่ามันเป็นขอบเขตระหว่างตัวอักษรของคำและไม่ใช่ตัวอักษรเพราะมันตรงกับระหว่างตัวอักษรของคำและจุดเริ่มต้นหรือจุดสิ้นสุดของสตริงถ้าตัวละครนั้นอยู่ที่จุดเริ่มต้น / สิ้นสุดของสตริง
MRAB

5
มันยังไม่ถูกต้องนัก \bการยืนยันความกว้างเป็นศูนย์ มันไม่ได้ตรงกับตัวละครที่มันตรงกับตำแหน่ง
Alan Moore

10

@Mahender คุณอาจหมายถึงความแตกต่างระหว่าง\W(แทน\w) และ\bและ ถ้าไม่เช่นนั้นฉันจะเห็นด้วยกับ @BoltClock และ @jwismar ด้านบน มิฉะนั้นจะอ่านต่อ

\Wจะจับคู่อักขระที่ไม่ใช่คำใด ๆ และดังนั้นจึงเป็นเรื่องง่ายที่จะลองใช้เพื่อจับคู่ขอบเขตของคำ ปัญหาคือว่ามันจะไม่ตรงกับจุดเริ่มต้นหรือจุดสิ้นสุดของบรรทัด \bเหมาะสำหรับการจับคู่ขอบเขตของคำมากขึ้นเนื่องจากจะตรงกับจุดเริ่มต้นหรือจุดสิ้นสุดของบรรทัด พูดประมาณ (ผู้ใช้มีประสบการณ์มากขึ้นสามารถแก้ไขฉันที่นี่) สามารถจะคิดว่าเป็น\b (\W|^|$)[แก้ไข: เนื่องจาก @ Ωล้านกล่าวถึงด้านล่าง\bเป็นการจับคู่ที่ไม่มีความยาวดังนั้นจึง(\W|^|$)ไม่ถูกต้อง แต่หวังว่าจะช่วยอธิบายความแตกต่าง]

ตัวอย่างรวดเร็ว: สำหรับสตริงHello World, .+\WจะตรงกับHello_(พื้นที่) Worldแต่จะไม่ตรงกับ .+\bจะตรงกับทั้งสองและHelloWorld


ฉันไม่เห็นด้วยที่มี\bความหมายเหมือนกับ(\W|^|$)เนื่องจาก(\W|^|$)จะรวมอักขระที่ไม่ใช่คำในผลลัพธ์การจับคู่ คุณสามารถตรวจสอบความเป็นจริงที่นี่ => regexr.com/3qf98
Victor

\bสำหรับฉันหมายถึงเหมือนกับ(?<=\W|^|$)เมื่อใช้ก่อนรูปแบบและ(?=\W|^|$)เมื่อใช้หลังรูปแบบ คุณสามารถตรวจสอบสิ่งที่ผมพูดนี่ => regexr.com/3qf9h เพียงเปรียบเทียบกับผลลัพธ์ของ\bจุดยึดที่นี่ => regexr.com/3qf9t
Victor

4
\b <= this is a word boundary.

จับคู่ที่ตำแหน่งที่ตามด้วยอักขระคำ แต่ไม่นำหน้าด้วยอักขระคำหรือที่นำหน้าด้วยอักขระคำ แต่ไม่ตามด้วยอักขระคำ

\w <= stands for "word character". 

ตรงกับอักขระ ASCII เสมอ [A-Za-z0-9_]

มีสิ่งใดที่คุณพยายามจับคู่ไหม

บางเว็บไซต์ Regex ที่มีประโยชน์สำหรับผู้เริ่มต้นหรือเพียงแค่กระหายน้ำ

ฉันพบสิ่งนี้ว่าเป็นหนังสือที่มีประโยชน์มาก:


5
นี่เป็นคำตอบที่ดี แต่ก็มีประโยชน์ที่ต้องจำไว้ว่า\wไม่เสมอไปกับอักขระ ASCII [A-Za-z0-9_]- มันจะจับคู่กับรหัสรหัสตัวอักษรและตัวเลข Unicode และอาจตรงกับอักขระ ISO-Latin-1 แบบ 8 บิตหากตั้งค่าโลแคลไว้อย่างเหมาะสม .
ทิมเพียร์ซ

2

\wคือไม่ได้ขอบเขตของคำที่มันตรงกับตัวอักษรคำใด ๆ [a-zA-Z0-9_]รวมทั้งขีด: \b เป็นขอบเขตของคำซึ่งก็คือมันตรงกับตำแหน่งระหว่างคำและตัวอักษรที่ไม่ใช่ตัวอักษรและตัวเลข: \Wหรือ[^\w]หรือ

การใช้งานเหล่านี้อาจแตกต่างกันไปในแต่ละภาษา

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