Perbedaan antara \ w dan \ b karakter meta ekspresi reguler

142

Adakah yang bisa menjelaskan perbedaan antara \bdan \wmetakarakter ekspresi reguler? Ini adalah pemahaman saya bahwa kedua metakarakter ini digunakan untuk batas kata. Selain itu, karakter meta mana yang efisien untuk konten multibahasa?

Mahender
sumber
11
\wmewakili karakter kata , sementara \bmewakili batas kata antara karakter kata dan karakter non-kata. Mereka bukan hal yang sama.
BoltClock

Jawaban:

259

Metacharacter \badalah jangkar seperti tanda sisipan dan dolar. Ini cocok pada posisi yang disebut "batas kata" . Pertandingan ini panjangnya nol.

Ada tiga posisi berbeda yang memenuhi syarat sebagai batasan kata:

  • Sebelum karakter pertama dalam string, jika karakter pertama adalah karakter kata.
  • Setelah karakter terakhir dalam string, jika karakter terakhir adalah karakter kata.
  • Antara dua karakter dalam string, di mana satu adalah karakter kata dan yang lainnya bukan karakter kata.

Sederhananya: \bmemungkinkan Anda melakukan pencarian "seluruh kata saja" menggunakan ekspresi reguler dalam bentuk \bword\b. Sebuah "kata karakter" adalah karakter yang dapat digunakan untuk membentuk kata-kata. Semua karakter yang bukan "karakter kata" adalah "karakter non-kata" .

Dalam semua rasa, karakter [a-zA-Z0-9_]adalah karakter kata. Ini juga dicocokkan dengan kelas karakter tangan pendek \w. Rasa yang menunjukkan "ascii" untuk batas kata dalam perbandingan rasa hanya mengenali ini sebagai karakter kata.

\wsingkatan dari "karakter kata" , biasanya [A-Za-z0-9_]. Perhatikan dimasukkannya garis bawah dan digit.

\Badalah versi negasi dari \b. \Bcocok di setiap posisi di mana \btidak. Secara efektif, \Bcocok di posisi mana pun di antara dua karakter kata serta di posisi mana pun di antara dua karakter non-kata.

\Wadalah kependekan dari [^\w], versi negasi dari \w.

Ωmega
sumber
21

\wcocok dengan karakter kata. \badalah kecocokan dengan lebar nol yang cocok dengan karakter posisi yang memiliki karakter kata di satu sisi, dan sesuatu yang bukan karakter kata di sisi lain. (Contoh hal yang bukan karakter kata termasuk spasi, awal dan akhir string, dll.)

\wpertandingan a, b, c, d, e, dan fdalam "abc def"
\bpertandingan (zero-lebar) posisi sebelum a, sesudah c, sebelum d, dan setelah fdi"abc def"

Lihat: http://www.regular-expressions.info/reference.html/

jwismar
sumber
3
Lebih tepat untuk mengatakan bahwa itu adalah batas antara karakter kata dan bukan karakter kata karena itu juga cocok antara karakter kata dan awal atau akhir string jika karakter itu pada awal / akhir string.
MRAB
5
Itu masih belum benar. \bpernyataan lebar nol; itu tidak cocok dengan karakter , itu cocok dengan posisi .
Alan Moore
10

@ Davidender, Anda mungkin memaksudkan perbedaan antara \W(bukan \w) dan \b. Jika tidak, maka saya akan setuju dengan @BoltClock dan @jwismar di atas. Kalau tidak, teruskan membaca.

\Wakan cocok dengan karakter non-kata dan karenanya mudah digunakan untuk mencocokkan dengan batas kata. Masalahnya adalah bahwa itu tidak akan cocok dengan awal atau akhir suatu baris. \blebih cocok untuk mencocokkan batas kata karena juga akan cocok dengan awal atau akhir suatu baris. Secara kasar (pengguna yang lebih berpengalaman dapat memperbaiki saya di sini) \bdapat dianggap sebagai (\W|^|$). [Sunting: seperti @ Ωmega menyebutkan di bawah ini, \badalah kecocokan dengan panjang nol sehingga (\W|^|$)tidak sepenuhnya benar, tetapi mudah-mudahan membantu menjelaskan perbedaan]

Contoh cepat: Untuk string Hello World, .+\Wakan cocok Hello_(dengan spasi) tetapi tidak akan cocok World. .+\bakan cocok dengan keduanya Hellodan World.

mtariq
sumber
Saya tidak setuju pada \barti yang sama dengan (\W|^|$), karena (\W|^|$)akan memasukkan karakter non-kata dalam hasil pencocokan. Anda dapat memeriksa fakta ini di sini => regexr.com/3qf98 .
Victor
\bbagi saya, berarti sama seperti (?<=\W|^|$)ketika digunakan sebelum suatu pola dan (?=\W|^|$)ketika digunakan setelah suatu pola. Anda dapat memeriksa apa yang saya bicarakan di sini => regexr.com/3qf9h . Bandingkan dengan hasil \bjangkar di sini => regexr.com/3qf9t
Victor
4
\b <= this is a word boundary.

Cocok dengan posisi yang diikuti oleh karakter kata tetapi tidak didahului oleh karakter kata, atau yang didahului oleh karakter kata tetapi tidak diikuti oleh karakter kata.

\w <= stands for "word character". 

Itu selalu cocok dengan karakter ASCII [A-Za-z0-9_]

Apakah ada sesuatu yang spesifik yang ingin Anda cocokkan?

Beberapa situs web regex yang berguna untuk pemula atau hanya untuk membasahi selera makan Anda.

Saya menemukan ini sebagai buku yang sangat berguna:

james emanon
sumber
5
Ini adalah jawaban yang baik, tetapi berguna untuk mengingat bahwa \wtidak selalu setara dengan karakter ASCII [A-Za-z0-9_]- itu juga akan cocok dengan poin kode Unicode alfanumerik, dan mungkin cocok dengan karakter ISO-Latin-1 8-bit jika lokal diatur dengan tepat. .
Tim Pierce
2

\wadalah tidak batas kata, itu cocok dengan karakter kata, termasuk garis bawah: [a-zA-Z0-9_]. \b adalah batas kata, artinya cocok dengan posisi antara kata dan karakter non-alfanumerik: \Watau [^\w].

Implementasi ini dapat bervariasi dari satu bahasa ke bahasa lainnya.

Julián Urbano
sumber