\ W ve \ b normal ifade meta karakterleri arasındaki fark


142

Herkes arasındaki farkı açıklayabilir \bve \wdüzenli ifade meta karakterleri? Anladığım kadarıyla her iki metakarakter de kelime sınırları için kullanılıyor. Bunun dışında hangi meta karakter çok dilli içerik için etkilidir?


11
\wkelime karakterini , kelime karakteri ile kelime olmayan karakter arasındaki\b kelime sınırını temsil eder . Aynı şey değiller.
BoltClock

Yanıtlar:


259

Metakarakter \b, şapka ve dolar işareti gibi bir çapadır. "Sözcük sınırı" adı verilen bir konumda eşleşir . Bu eşleşme sıfır uzunluktadır.

Kelime sınırları olarak nitelendirilen üç farklı pozisyon vardır:

  • Dizedeki ilk karakterden önce, ilk karakter bir kelime karakteriyse.
  • Dizedeki son karakterden sonra, son karakter bir kelime karakteriyse.
  • Dizede, biri sözcük karakteri diğeri de sözcük karakteri olmayan iki karakter arasında.

Basitçe ifade etmek gerekirse: şeklinde bir ifadeyi kullanarak "sadece tam kelimeler" araması \byapmanızı sağlar . Bir "kelimesi karakteri" kelime oluşturacak şekilde kullanılabilecek bir karakterdir. Olmayan tüm karakterler "kelimesi karakterler" olan "sözcük olmayan karakterler" .\bword\b

Tüm tatlarda, karakterler [a-zA-Z0-9_]kelime karakteridir. Bunlar aynı zamanda kısa el karakter sınıfı ile de eşleştirilir \w. Lezzet karşılaştırmasında kelime sınırları için "ascii" gösteren lezzetler, sadece kelime karakterleri olarak tanınırlar.

\wgenellikle "kelime karakteri" anlamına gelir [A-Za-z0-9_]. Alt çizgi ve rakamların dahil edildiğine dikkat edin.

\B'nin ihmal edilmiş sürümüdür \b. olmadığı \Bher pozisyonda eşleşir \b. Etkili bir şekilde, \Biki sözcük karakteri arasındaki herhangi bir konumda ve iki sözcük olmayan karakter arasındaki herhangi bir konumda eşleşir.

\Wiçin kısaltılmış, kısaltılmış [^\w]sürümü \w.


21

\wbir kelime karakteriyle eşleşir. \b, bir tarafında kelime karakteri olan bir konum karakteri ile diğer tarafında kelime karakteri olmayan bir şeyle eşleşen sıfır genişlikli eşlemedir. (Kelime karakteri olmayan şeylere örnek olarak boşluk, dizenin başlangıcı ve bitişi vb.)

\wstoktaki a, b, c, d, e, ve fde "abc def"
\beşleşir (sıfır-genişlik) pozisyonu önce a, sonra c, daha önce dve daha sonra fiçinde"abc def"

Bkz. Http://www.regular-expressions.info/reference.html/


3
Bir kelime karakteri ile bir kelime karakteri arasındaki sınır olduğunu söylemek daha doğrudur, çünkü bu karakter dizenin başlangıcında / sonundaysa, bir kelime karakteri ile bir dizenin başlangıcı veya sonu arasında da eşleşir.
MRAB

5
Hala tam olarak doğru değil. \bsıfır genişlikli bir iddia; bir karakterle eşleşmez , bir konumla eşleşir .
Alan Moore

10

@Mahender, muhtemelen \W(yerine \w) ile arasındaki farkı kastediyordunuz \b. Değilse, o zaman yukarıdaki @BoltClock ve @jwismar ile aynı fikirde olurdum. Aksi takdirde okumaya devam edin.

\Wherhangi bir kelime olmayan karakterle eşleşir ve bu nedenle kelime sınırlarını eşleştirmek için onu kullanmaya çalışmak kolaydır. Sorun, bir satırın başlangıcı veya bitişi ile eşleşmemesidir. \b, bir satırın başlangıcı veya bitişiyle de eşleşeceğinden, kelime sınırlarını eşleştirmek için daha uygundur. Kabaca konuşmak gerekirse (daha deneyimli kullanıcılar beni burada düzeltebilir) \bolarak düşünülebilir (\W|^|$). [Düzenle: aşağıdaki @ Ωmega'dan bahsedildiği gibi, \bsıfır uzunluklu bir eşlemedir, bu yüzden (\W|^|$)kesinlikle doğru değildir, ancak umarım farkın açıklanmasına yardımcı olur]

Hızlı örnek: dize için Hello World, .+\Weşleşir Hello_(boşluk), ancak maç olmayacak World. .+\bher ikisiyle de eşleşir Hellove World.


Ben katılmıyorum \baynı anlam (\W|^|$)beri, (\W|^|$)eşleştirme sonucu içeride olmayan bir kelime karakterle içerecektir. Bu gerçeği buradan kontrol edebilirsiniz => regexr.com/3qf98 .
Victor

\bbenim için, (?<=\W|^|$)bir kalıptan önce kullanıldığında ve (?=\W|^|$)bir kalıptan sonra kullanıldığında aynı anlama gelir . Ne konuştuğumu buradan kontrol edebilirsiniz => regexr.com/3qf9h . Sadece \bburada çapa sonuçları ile karşılaştırın => regexr.com/3qf9t
Victor

4
\b <= this is a word boundary.

Bir kelime karakterinden sonra gelen, ancak bir kelime karakterinden önce gelmeyen veya bir kelime karakterinden önce gelen, ancak bir kelime karakterinden sonra gelmeyen bir konumla eşleşir.

\w <= stands for "word character". 

Her zaman ASCII karakterleriyle eşleşir [A-Za-z0-9_]

Eşleştirmeye çalıştığınız belirli bir şey var mı?

Yeni başlayanlar için veya sadece iştahınızı ıslatmak için bazı yararlı regex web siteleri.

Bunu çok faydalı bir kitap olarak buldum:


5
Bu iyi bir yanıttır, ancak \wASCII karakterlerine her zaman eşdeğer olmadığını hatırlamak yararlıdır [A-Za-z0-9_]- ayrıca alfasayısal Unicode kod noktalarıyla da eşleşir ve yerel ayar uygun şekilde ayarlanırsa 8 bit ISO-Latin-1 karakterleriyle eşleşebilir .
Tim Pierce

2

\wolduğu değil o alt çizgi dahil herhangi bir kelime karakterle, kibrit, bir kelime sınırı: [a-zA-Z0-9_]. \b ise : bir kelime sınırı olduğunu, bir kelime ve bir alfanümerik olmayan karakterin arasındaki konumu maçları \Wya [^\w].

Ancak bu uygulamalar dilden dile değişebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.