Câu trả lời:
Metacharacter \b
là một mỏ neo như dấu mũ và ký hiệu đô la. Nó phù hợp tại một vị trí được gọi là "ranh giới từ" . Trận đấu này có độ dài bằng không.
Có ba vị trí khác nhau đủ điều kiện làm ranh giới từ:
Nói một cách đơn giản: \b
cho phép bạn thực hiện tìm kiếm "toàn bộ từ" bằng cách sử dụng một biểu thức thông thường ở dạng \bword\b
. Một "nhân vật từ" là một nhân vật có thể được sử dụng để tạo từ. Tất cả các ký tự không phải là "ký tự từ" là "ký tự không phải từ" .
Trong tất cả các hương vị, các nhân vật [a-zA-Z0-9_]
là nhân vật từ. Chúng cũng được kết hợp bởi lớp nhân vật tay ngắn \w
. Hương vị hiển thị "ascii" cho ranh giới từ trong so sánh hương vị chỉ nhận ra đây là các ký tự từ.
\w
là viết tắt của "nhân vật từ" , thường [A-Za-z0-9_]
. Lưu ý sự bao gồm của dấu gạch dưới và chữ số.
\B
là phiên bản phủ định của \b
. \B
phù hợp ở mọi vị trí \b
không. Thực tế, \B
khớp ở bất kỳ vị trí nào giữa hai ký tự từ cũng như tại bất kỳ vị trí nào giữa hai ký tự không phải từ.
\W
là viết tắt của [^\w]
, phiên bản phủ định của \w
.
\w
phù hợp với một nhân vật từ. \b
là một kết hợp có độ rộng bằng 0 khớp với một ký tự vị trí có một ký tự từ ở một bên và một thứ không phải là ký tự từ ở bên kia. (Ví dụ về những thứ không phải là ký tự từ bao gồm khoảng trắng, đầu và cuối chuỗi, v.v.)
\w
trận đấu a
, b
, c
, d
, e
, và f
trong "abc def"
\b
trận đấu với (zero-width) vị trí trước a
, sau c
, trước d
và sau f
trong"abc def"
\b
một khẳng định độ rộng bằng không; Nó không phù hợp với một nhân vật , nó phù hợp với một vị trí .
@Mahender, có lẽ bạn có nghĩa là sự khác biệt giữa \W
(thay vì \w
) và \b
. Nếu không, thì tôi sẽ đồng ý với @BoltClock và @jwismar ở trên. Nếu không thì tiếp tục đọc.
\W
sẽ phù hợp với bất kỳ ký tự không phải từ nào và vì vậy thật dễ dàng để cố gắng sử dụng nó để phù hợp với ranh giới từ. Vấn đề là nó sẽ không khớp với điểm bắt đầu hoặc kết thúc của một dòng. \b
phù hợp hơn cho việc kết hợp các ranh giới từ vì nó cũng sẽ khớp với đầu hoặc cuối của một dòng. Nói một cách đơn giản (người dùng có nhiều kinh nghiệm hơn có thể sửa tôi ở đây) \b
có thể được coi là (\W|^|$)
. [Chỉnh sửa: như @ egamega đề cập bên dưới, \b
là một trận đấu có độ dài bằng không nên (\W|^|$)
không hoàn toàn chính xác, nhưng hy vọng sẽ giúp giải thích khác biệt]
Ví dụ nhanh: Đối với chuỗi Hello World
, .+\W
sẽ khớp Hello_
(với khoảng trắng) nhưng sẽ không khớp World
. .+\b
sẽ phù hợp với cả hai Hello
và World
.
\b
ý nghĩa giống như (\W|^|$)
, vì (\W|^|$)
sẽ bao gồm ký tự không từ trong kết quả khớp. Bạn có thể kiểm tra thực tế này tại đây => regexr.com/3qf98 .
\b
đối với tôi, có nghĩa giống như (?<=\W|^|$)
khi được sử dụng trước một mẫu và (?=\W|^|$)
khi được sử dụng sau một mẫu. Bạn có thể kiểm tra những gì tôi đang nói ở đây => regexr.com/3qf9h . Chỉ cần so sánh với kết quả của các \b
neo ngay tại đây => regexr.com/3qf9t
\b <= this is a word boundary.
Khớp với một vị trí được theo sau bởi một ký tự từ nhưng không có trước một ký tự từ hoặc trước một ký tự từ nhưng không được theo sau bởi một ký tự từ.
\w <= stands for "word character".
Nó luôn khớp với các ký tự ASCII [A-Za-z0-9_]
Có điều gì cụ thể bạn đang cố gắng để phù hợp?
Một số trang web regex hữu ích cho người mới bắt đầu hoặc chỉ để làm giảm sự thèm ăn của bạn.
Tôi thấy đây là một cuốn sách rất hữu ích:
\w
không phải lúc nào cũng tương đương với các ký tự ASCII [A-Za-z0-9_]
- nó cũng sẽ khớp với các điểm mã Unicode chữ và số và có thể khớp với các ký tự ISO-Latin-1 8 bit nếu ngôn ngữ được đặt một cách thích hợp .
\w
là không một ranh giới từ, nó phù hợp với bất kỳ ký tự văn bản, bao gồm dấu gạch dưới: [a-zA-Z0-9_]
. \b
là một ranh giới từ, nghĩa là, nó phù hợp với vị trí giữa một từ và một ký tự không chữ và số: \W
hoặc [^\w]
.
Những triển khai này có thể thay đổi từ ngôn ngữ để ngôn ngữ mặc dù.
\w
đại diện cho một ký tự từ , trong khi\b
đại diện cho một ranh giới từ giữa một ký tự từ và một ký tự không từ. Chúng không giống nhau.