Perbedaan antara \ b dan \ B dalam regex

103

Saya membaca buku tentang ekspresi reguler dan saya menemukan contoh ini untuk \b:

Kucing itu menyebarkan makanannya ke seluruh ruangan.

Menggunakan regex - \bcat\bakan cocok dengan kata cattetapi tidak catdalam scattered.

Untuk \Bpenulis gunakan contoh berikut:

Harap masukkan sembilan digit id seperti itu

muncul di kode sandi warna Anda.

Menggunakan \B-\Bpencocokan ekspresi reguler di -antara kata tersebut color - coded. Menggunakan \b-\bdi sisi lain cocok dengan -in nine-digitdan pass-key.

Kenapa di contoh pertama kita gunakan \buntuk memisahkan catdan yang kedua digunakan \Buntuk memisahkan -? Menggunakan \bdalam contoh kedua melakukan kebalikan dari apa yang dilakukannya sebelumnya.

Tolong jelaskan perbedaannya kepada saya.

EDIT: Juga, adakah yang bisa menjelaskan dengan contoh baru?

stirredo
sumber

Jawaban:

84

Kebingungan ini berasal dari pemikiran Anda yang \bcocok dengan spasi (mungkin karena "b" menunjukkan "kosong").

\bcocok dengan string kosong di awal atau akhir kata . \Bcocok dengan string kosong bukan di awal atau akhir kata. Kuncinya di sini adalah bahwa "-" bukanlah bagian dari sebuah kata. Jadi <left>-<right>cocok \b-\bkarena ada batas kata di kedua sisi -. Di sisi lain untuk<left> - <right> (perhatikan spasi), tidak ada batas kata di kedua sisi tanda hubung. Batas kata adalah satu spasi lebih jauh ke kiri dan kanan.

Di sisi lain, saat menelusuri \bcat\bbatas kata berperilaku lebih intuitif, dan mencocokkan "kucing" seperti yang diharapkan.

andrewdski
sumber
2
Ya, saya memang bingung \ b dengan spasi kosong. Namun, saya masih merasa sedikit bingung. Bisakah saya meminta satu contoh lagi?
stirredo
3
Kuncinya adalah itu -tidak dianggap sebagai bagian dari sebuah kata. Demikian pula, !bukan merupakan bagian dari sebuah kata. Jadi sekali lagi \b!\bcocok dengan "uunet! Iamold", tetapi tidak cocok dengan "Wow! You are." Anda dapat mencoba hal ini di regexpal.com .
andrewdski
@andrewdski Dalam kasus saya \ b juga menangkap tanda baca ... Saya mencoba dengan \ b [A-Z0-9] + \ b pada 1987894, 3219800; 234567, 345261. dan berfungsi dengan baik, saya hanya memperoleh nomor
gunzapper
1
Hanya menambahkan bahwa sebuah karya dalam ekspresi reguler terdiri dari huruf (a– z dan A– Z), angka, dan “_” [garis bawah]). Segala sesuatu yang lain bukan kata-kata.
Maralc
Bisakah seseorang menguraikan baris ini\B matches the empty string not at the beginning or end of a word
Arun Gowda
68

\badalah batas kata dengan lebar nol. Secara khusus:

Cocok pada posisi antara karakter kata (apa pun yang cocok dengan \ w) dan karakter non-kata (apa pun yang cocok dengan [^ \ w] atau \ W) serta di awal dan / atau akhir string jika yang pertama dan / atau karakter terakhir dalam string adalah karakter kata.

Contoh: .\bkecocokan cdalamabc

\Badalah batas non-kata dengan lebar nol. Secara khusus:

Cocok pada posisi antara dua karakter kata (yaitu posisi antara \ w \ w) serta pada posisi antara dua karakter non-kata (yaitu \ W \ W).

Contoh: \B.\Bkecocokan bdalamabc

Lihat regular-expressions.info untuk info regex hebat lainnya

Bohemian
sumber
10
+1 karena lebar nol adalah bagian penting dari definisi. Jika tidak memiliki lebar nol, maka itu juga akan mengambil karakter kata / non-kata tersebut di bagian pola yang cocok.
Ben Hocking
5
Dengan kata lain, \ B cocok dengan titik antara \ W dan \ W atau antara \ w dan \ w, tetapi tidak antara \ W dan \ w.
1
Jawaban ini telah ditambahkan ke FAQ Ekspresi Reguler Stack Overflow , di bawah "Jangkar".
aliteralmind
1
@stephenhuh string.match()hanya mengembalikan pertandingan pertama, kecuali jika Anda menambahkan bendera globalg : "abc def".match(/\b./g)kembali['a', ' ', 'd']
Bohemian
1
Saya pikir ini adalah jawaban yang lebih baik. Saya juga harus menjadi orang yang diterima karena itu menyelesaikan kebingungan. Lebih banyak yang bisa dipelajari di sini.
Serigala
38

Dengan contoh yang berbeda:

Pertimbangkan ini adalah string dan pola yang akan dicari adalah 'cat':

text = "catmania thiscat thiscatmaina";

Sekarang definisi,

'\ b' menemukan / mencocokkan pola di awal atau akhir setiap kata.

'\ B' tidak menemukan / cocok dengan pola di awal atau akhir setiap kata.

Kasus Berbeda:

Kasus 1: Di awal setiap kata

result = text.replace(/\bcat/g, "ct");

Sekarang, hasilnya adalah "ctmania thiscat thiscatmaina"

Kasus 2: Di akhir setiap kata

result = text.replace(/cat\b/g, "ct");

Sekarang, hasilnya adalah "catmania thisct thiscatmaina"

Kasus 3: Tidak pada awalnya

result = text.replace(/\Bcat/g, "ct");

Sekarang, hasilnya adalah "catmania thisct thisctmaina"

Kasus 4: Tidak pada akhirnya

result = text.replace(/cat\B/g, "ct");

Sekarang, hasilnya adalah "ctmania thiscat thisctmaina"

Kasus 5: Bukan awal maupun akhir

result = text.replace(/\Bcat\B/g, "ct");

Sekarang, hasilnya adalah "catmania thiscat thisctmaina"

Semoga ini membantu :)

Agam
sumber
Koreksi saya jika saya salah, tetapi, saat menggunakan \ bcat \ b, jika string kita adalah, misalnya: "catcat is my cat" => kata pertama (catcat) akan diterapkan pada kondisi ini. tidak?.
Kosem
8

Karakter meta \ b adalah jangkar seperti tanda sisipan dan tanda dolar. Ini cocok pada posisi yang disebut "batas kata". Pertandingan ini panjangnya nol.

Ada tiga posisi berbeda yang memenuhi syarat sebagai batas 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 yang satu adalah karakter kata dan yang lainnya bukan karakter kata.

\ B adalah versi yang dinegasikan dari \ b . \ B cocok di setiap posisi di mana \ b tidak. Secara efektif, \ B cocok di posisi mana pun di antara dua karakter kata serta di posisi mana pun di antara dua karakter bukan kata.

Sumber: http://www.regular-expressions.info/wordboundaries.html

Daniel Hilgarth
sumber
3

\bcocok dengan batas kata. \Bcocok dengan non-batasan kata, dan setara dengan (terima kasih kepada @Alan Moore atas koreksinya!) . Keduanya[^\b](?!\b) lebar nol.

Lihat http://www.regular-expressions.info/wordboundaries.html untuk detailnya. Situs ini sangat berguna untuk banyak pertanyaan regex dasar.

Matt Ball
sumber
4
\Badalah tidak setara dengan [^\b]. Kelas karakter ( [...]atau [^...]) menggunakan tepat satu karakter, sementara pernyataan lebar-nol menyukai \bdan \Btidak mengonsumsi apa pun. Jika Anda memasukkan \bkelas karakter, ini membutuhkan arti yang sama sekali berbeda: [\b]cocok dengan spasi mundur, dan [^\b]cocok dengan karakter apa pun kecuali spasi mundur. \Bbenar-benar setara dengan (?!\b).
Alan Moore
@Alan terima kasih, Anda sepenuhnya benar - Saya tidak bangun pagi ini ketika saya menulisnya. Tetap.
Matt Ball
4
... tapi mengapa ada orang yang ingin mencocokkan backspace berada di luar jangkauan saya. : D
Alan Moore
1

Biarkan mengambil string seperti:

XIX IXI XX XI II IIXX XXII II XX -X X- XI IX -X- -IX -XI IX- XI- X_X _X-

Catatan: Garis bawah (_) tidak dianggap sebagai karakter khusus dalam kasus ini.

  1. /\bX\b/g Harus dimulai dan diakhiri dengan karakter khusus atau Spasi putih

XIX IXI XX X I II IIXX XXII II X - X - X X - X -I I- X - X - -I- X - X -I I- X - X -I- X_X _X-


  1. /\bX/g Harus dimulai dengan karakter khusus atau Spasi putih

X IX IXI X X X I II IIXX X XII II X - X - X X - X -I I- X - X - -I- X - X -I I- X - X -I- X _X _X-


  1. /X\b/g Harus diakhiri dengan karakter khusus atau Spasi putih

XI X IXI X X X I II IIX X XXII II X - X - X X - X -I I- X - X - -I- X - X -I I- X - X -I- X_ X _ X -


  1. /\BX\B/g
    Tidak boleh dimulai dan tidak diakhiri dengan karakter khusus atau Spasi putih

XIX I X I XX XI II II X X X X II II XX -X X- XI IX -X- -IX -XI IX- XI- X_X _X-


  1. /\BX/gSebaiknya tidak dimulai dengan karakter khusus atau Spasi putih

XI X I X I X X XI II II XX X X II II XX -X X- XI IX -X- -IX -XI IX- XI- X_ X _ X -


  1. /X\B/gTidak boleh diakhiri dengan karakter khusus atau Spasi putih

X IX I X I X X XI II II X X XX II II XX -X X- XI IX -X- -IX -XI IX- XI- X _X _X-


  1. /\bX\B/gHarus dimulai dan tidak diakhiri dengan karakter khusus atau Spasi putih

X IX IXI X X XI II II X X X XII II XX -X X- XI IX -X- -IX -XI IX- XI- X _X _X-


  1. /\BX\b/gTidak boleh dimulai dan harus diakhiri dengan karakter khusus atau Spasi putih

XI X IXI X X XI II IIX X XXII II XX -X X- XI IX -X- -IX -XI IX- XI- X_ X _ X -

Kartik Patodi
sumber
1

Sumber © Hak Cipta RexEgg.com

Batas Kata: \ b *

Batas kata \ b cocok dengan posisi di mana satu sisi adalah karakter kata (biasanya huruf, angka atau garis bawah — tetapi lihat di bawah untuk variasi di seluruh mesin) dan sisi lainnya bukan karakter kata (misalnya, mungkin merupakan awal dari string atau karakter spasi).

Oleh karena itu, regex \ bcat \ b akan cocok dengan kucing dalam kucing hitam, tetapi tidak akan cocok dengan kucing di catatonic, tomcat, atau sertifikat. Menghapus salah satu batasan, \ bcat akan mencocokkan kucing di lele, dan kucing \ b akan mencocokkan kucing di tomcat, tetapi tidak sebaliknya. Keduanya, tentu saja, akan cocok sendiri dengan kucing.

Bukan-batas-kata: \ B

\ B cocok dengan semua posisi di mana \ b tidak cocok. Oleh karena itu, cocok dengan:

✽ Jika tidak ada sisi yang berupa karakter kata, misalnya pada posisi mana pun dalam string $ = (@ -% ++) (termasuk awal dan akhir string)

✽ Jika kedua sisi merupakan karakter kata, misalnya antara H dan i di Hi!

Ini mungkin tidak terlalu berguna, tetapi terkadang \ B adalah yang Anda inginkan. Misalnya,

✽ \ Bcat \ B akan menemukan cat yang sepenuhnya dikelilingi oleh karakter kata, seperti dalam sertifikat, tetapi tidak sendiri maupun di awal atau akhir kata.

✽ cat \ B akan menemukan kucing baik dalam sertifikat dan lele, tetapi tidak di tomcat atau sendiri.

✽ \ Bcat akan menemukan kucing baik dalam sertifikat dan tomcat, tetapi tidak pada lele atau sendiri.

✽ \ Bcat | cat \ B akan menemukan kucing dalam situasi tertanam, misalnya dalam sertifikat, lele atau kucing jantan, tetapi tidak sendiri.

Ganesh MS
sumber
1

\ b digunakan sebagai batas kata

word = "categorical cat"

Temukan semua "kucing" di kata di atas

tanpa \ b

re.findall(r'cat',word)
['cat', 'cat']

dengan \ b

re.findall(r'\bcat\b',word)
['cat']
Kavyajeet Bora
sumber
0

\Badalah tidak \b misalnya negatif \b

pass-keydi sini tidak ada batasan kata di samping -sehingga cocok\B dengan contoh pertama anda ada batasan kata disamping cat sehingga cocok\b

aturan serupa juga berlaku untuk orang lain. \Wnegatif dari \w \UPPER CASEnegatif\LOWER CASE

Neel Basu
sumber