Sự khác biệt giữa các ký tự meta biểu thức chính quy \ w và \ b


142

Bất cứ ai có thể giải thích sự khác biệt giữa \b\wsiêu nhân biểu thức chính quy? Theo hiểu biết của tôi, cả hai siêu ký tự này đều được sử dụng cho các ranh giới từ. Ngoài ra, nhân vật meta nào hiệu quả cho nội dung đa ngôn ngữ?


11
\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.
BoltClock

Câu trả lời:


259

Metacharacter \blà 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ừ:

  • Trước ký tự đầu tiên trong chuỗi, nếu ký tự đầu tiên là ký tự từ.
  • Sau ký tự cuối cùng trong chuỗi, nếu ký tự cuối cùng là ký tự từ.
  • Giữa hai ký tự trong chuỗi, trong đó một ký tự là từ và ký tự còn lại không phải là ký tự từ.

Nói một cách đơn giản: \bcho 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ừ""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ừ.

\wlà 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ố.

\Blà phiên bản phủ định của \b. \Bphù hợp ở mọi vị trí \bkhông. Thực tế, \Bkhớ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ừ.

\Wlà viết tắt của [^\w], phiên bản phủ định của \w.


21

\wphù hợp với một nhân vật từ. \blà 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.)

\wtrận đấu a, b, c, d, e, và ftrong "abc def"
\btrận đấu với (zero-width) vị trí trước a, sau c, trước dvà sau ftrong"abc def"

Xem: http://www.THER-expressions.info/reference.html/


3
Sẽ đúng hơn khi nói rằng đó là ranh giới giữa một ký tự từ và không phải là ký tự từ vì nó cũng khớp giữa một ký tự từ và bắt đầu hoặc kết thúc chuỗi nếu ký tự đó ở đầu / cuối chuỗi.
MRAB

5
Nó vẫn không hoàn toàn đúng. \bmộ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í .
Alan Moore

10

@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.

\Wsẽ 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. \bphù 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) \bcó thể được coi là (\W|^|$). [Chỉnh sửa: như @ egamega đề cập bên dưới, \blà 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, .+\Wsẽ khớp Hello_(với khoảng trắng) nhưng sẽ không khớp World. .+\bsẽ phù hợp với cả hai HelloWorld.


Tôi không đồng ý với \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 .
Victor

\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 \bneo ngay tại đây => regexr.com/3qf9t
Victor

4
\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:


5
Đây là một câu trả lời hay, nhưng rất hữu ích khi nhớ rằng \wkhô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 .
Tim Pierce

2

\wkhô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 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ố: \Whoặc [^\w].

Những triển khai này có thể thay đổi từ ngôn ngữ để ngôn ngữ mặc dù.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.