Normal ifadede \ b ve \ B arasındaki fark


103

Düzenli ifade üzerine bir kitap okuyorum ve şu örnekle karşılaştım \b:

Kedi yemeğini odanın her tarafına dağıttı.

Normal ifade kullanmak - \bcat\bkelimeyle eşleşir catancak catin ile eşleşmez scattered.

İçin \Byazar şu örneği kullanır:

Lütfen dokuz basamaklı kimliği girin

renk kodlu geçiş anahtarınızda görünür.

Kelime arasında normal ifade \B-\Beşleşmeleri kullanma . Öte yandan kullanmak , in ve .-color - coded\b-\b-nine-digitpass-key

Nasıl Kullandığımız ilk örnekteki gelip \bayırmak catve ikinci kullanımda \Bayırmak için -? \bİkinci örnekte kullanmak , daha önce yaptığı şeyin tersini yapar.

Lütfen farkı bana açıklayın.

DÜZENLEME: Ayrıca, lütfen yeni bir örnekle açıklayabilir misiniz?

Yanıtlar:


84

Karışıklık, düşüncenizin \bboşluklarla eşleşmesinden kaynaklanıyor (muhtemelen "b" "boş" anlamına geldiği için ).

\bbir kelimenin başındaki veya sonundaki boş dizeyle eşleşir . \Bbir kelimenin başında veya sonunda olmayan boş dizeyle eşleşir. Buradaki anahtar, "-" nin bir kelimenin parçası olmamasıdır. Öyleyse <left>-<right>eşleşir \b-\bçünkü her iki tarafında kelime sınırları vardır -. Öte yandan <left> - <right>(boşluklara dikkat edin) için, çizginin her iki yanında sözcük sınırları yoktur. Kelime sınırları, solda ve sağda birer boşluktur.

Öte yandan, \bcat\bkelime sınırları ararken daha sezgisel davranır ve beklendiği gibi "kedi" ile eşleşir.


2
Evet, gerçekten boş bir alanla karıştırıyordum. Ancak yine de biraz kafam karışık. Senden bir örnek daha isteyebilir miyim?
stirredo

3
Anahtar, -bir kelimenin parçası olarak görülmemesidir. Benzer şekilde, !bir kelimenin parçası değildir. Yani yine \b!\b"uunet! İamold" ile eşleşir, ancak "Vay canına! Sen" ile eşleşmez. Bunları regexpal.com'da deneyebilirsiniz .
andrewdski

@andrewdski Benim durumumda \ b noktalama işaretlerini de yakalıyor ... 1987894, 3219800'de \ b [A-Z0-9] + \ b ile denedim; 234567, 345261. ve iyi çalışıyor, sadece sayıları
alıyorum

1
Normal ifadedeki bir çalışmanın harflerden (a– z ve A– Z), rakamlardan ve “_” [alt çizgi]) oluştuğunu ekliyoruz. Geri kalan her şey kelime değildir.
Maralc

Birisi bu satırı detaylandırabilir mi\B matches the empty string not at the beginning or end of a word
Arun Gowda

68

\bsıfır genişlikli bir kelime sınırıdır. Özellikle:

Bir sözcük karakteri (\ w ile eşleşen herhangi bir şey) ve sözcük olmayan bir karakter ([^ \ w] veya \ W ile eşleşen herhangi bir şey) arasındaki konumda ve ayrıca dizenin başında ve / veya sonunda eşleşir. ve / veya dizedeki son karakterler kelime karakterleridir.

Örnek: .\bmaçlar ciçindeabc

\Bsıfır genişlikli sözcük olmayan bir sınırdır. Özellikle:

İki sözcük karakteri arasındaki konumda (yani \ w \ w arasındaki konum) ve sözcük olmayan iki karakter arasındaki konumda (yani \ W \ W) eşleşir.

Örnek: \B.\Bmaçlar biçindeabc

Daha iyi regex bilgileri için normal- expressions.info'ya bakın


10
+1 çünkü sıfır genişlik, tanımın önemli bir parçasıdır. Sıfır genişlik olmasaydı, kalıbın eşleşen kısmında bu sözcük / sözcük olmayan karakterleri de alırdı.
Ben Hocking

5
Diğer bir deyişle, \ B, \ W ile \ W arasındaki veya \ w ile \ w arasındaki noktayla eşleşir, ancak \ W ile \ w arasındaki noktayla eşleşmez.

1
Bu cevap, "Bağlantılar" altındaki Yığın Taşması Normal İfadesi SSS bölümüne eklenmiştir .
aliteralmind

1
@stephenhuh string.match(), global bayrak eklemediğiniz sürece yalnızca ilk maçı döndürür g: "abc def".match(/\b./g)döner['a', ' ', 'd']
Bohemian

1
Sanırım bu daha iyi bir cevap. Ayrıca kafa karışıklığını çözdüğü için kabul edilen kişi ben olmalıyım. Burada öğrenilecek çok şey var.
Kurt

38

Farklı bir örnekle:

Bunun aranacak dize ve modelin 'kedi' olduğunu düşünün:

text = "catmania thiscat thiscatmaina";

Şimdi tanımlar,

'\ b' her kelimenin başındaki veya sonundaki kalıbı bulur / eşleşir.

'\ B' , her kelimenin başındaki veya sonundaki kalıbı bulamıyor / eşleşmiyor.

Farklı Durumlar:

Durum 1: Her kelimenin başında

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

Şimdi, sonuç "ctmania thiscat thiscatmaina" oluyor

Durum 2: Her kelimenin sonunda

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

Şimdi, sonuç "catmania thisct thiscatmaina"

Durum 3: Başlangıçta değil

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

Şimdi, sonuç "catmania thisct thisctmaina"

Durum 4: Sonunda değil

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

Şimdi, sonuç "ctmania thiscat thisctmaina"

Vaka 5: Ne başlangıç ​​ne de son

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

Şimdi, sonuç "catmania thiscat thisctmaina"

Bu yardımcı olur umarım :)


Yanlışsam düzeltin lütfen, ancak \ bcat \ b kullanırken, dizemiz şöyle olsaydı, örneğin: "kedikedi benim kedim" => ilk kelime (kedi kedisi) bu koşula uygulanacaktı. Hayır?.
Köşem

8

Metakarakter \ b, düzeltme işareti ve dolar işareti gibi bir çapadır. "Kelime sınırı" adı verilen bir konumla eşleşir. Bu eşleşme sıfır uzunluktadır.

Sözcük sınırları olarak nitelendirilen üç farklı konum vardır:

  • İlk karakter bir kelime karakteriyse, dizedeki ilk karakterden önce.
  • Dizedeki son karakterden sonra, son karakter bir kelime karakteriyse.
  • Birinin kelime karakteri ve diğerinin kelime karakteri olmadığı dizedeki iki karakter arasında.

\ B, \ b'nin olumsuzlanmış sürümüdür . \ B, \ b'nin eşleşmediği her konumda eşleşir. Etkili bir şekilde, \ B iki sözcük karakteri arasındaki herhangi bir konumda ve sözcük olmayan iki karakter arasındaki herhangi bir konumda eşleşir.

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


3

\bbir kelime sınırıyla eşleşir. \Bkelime sınırları olmayanlarla eşleşir ve eşdeğerdir ( düzeltme için @ Alan Moore'a teşekkürler !) . Her ikisi de sıfır genişliktedir.[^\b](?!\b)

Ayrıntılar için http://www.regular-expressions.info/wordboundaries.html bakın. Site, birçok temel normal ifade sorusu için son derece kullanışlıdır.


4
\Bolduğu değil eşdeğerdir [^\b]. Bir karakter sınıfı ( [...]veya [^...]) tam olarak bir karakter tüketirken, sıfır genişlikli iddialar hiçbir şey gibi \bve \Btüketmez. \bBir karakter sınıfına girerseniz , tamamen farklı bir anlam [\b]kazanır : bir geri boşlukla ve bir geri tuşu dışında[^\b] herhangi bir karakterle eşleşir . gerçekten eşdeğerdir . \B(?!\b)
Alan Moore

@Alan teşekkürler, tamamen haklısın - Bunu yazarken bu sabah uyanık değildim. Sabit.
Matt Ball

4
... ama neden bir geri boşlukla eşleşmek istesin beni aşıyor. : D
Alan Moore

1

Şöyle bir dizge alalım:

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

Not: Alt çizgi (_) bu durumda özel bir karakter olarak kabul edilmez.

  1. /\bX\b/g Özel bir karakter veya boşlukla başlamalı ve bitmelidir

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 Özel bir karakter veya boşlukla başlamalıdır

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 Özel bir karakter veya boşlukla bitmelidir

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
    Meli değil başlayıp değil özel bir karakter veya beyaz Space ile sona

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/gMeli değil özel bir karakter veya beyaz Space ile başlar

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/gMeli değil özel bir karakter veya beyaz Space ile sona

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/gBaşlayacak ve Meli değil özel bir karakter veya beyaz Space ile sona

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/gMeli değil başlar ve özel karakter veya beyaz Space bitmelidir

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


1

Kaynak © Telif Hakkı RexEgg.com

Kelime Sınırı: \ b *

Kelime sınırı \ b, bir tarafın bir kelime karakteri (genellikle bir harf, rakam veya alt çizgi - ancak motorlar arasındaki varyasyonlar için aşağıya bakın) ve diğer tarafın bir kelime karakteri olmadığı konumlarla eşleşir (örneğin, dize veya boşluk karakteri).

Bu nedenle \ bcat \ b normal ifadesi siyah bir kedideki kedi ile eşleşir, ancak katatonik, tomcat veya sertifika ile eşleşmez. Sınırlardan biri kaldırıldığında, \ bcat, kedi balığındaki kedi ile eşleşir ve kedi \ b, tomcat'taki kedi ile eşleşir, ancak bunun tersi olmaz. Elbette her ikisi de kendi başına kedi ile eşleşir.

Sözcük-olmayan-sınır: \ B

\ B, \ b'nin eşleşmediği tüm konumlarla eşleşir. Bu nedenle şunlarla eşleşir:

✽ Her iki taraf da bir kelime karakteri olmadığında, örneğin $ = (@ -% ++) dizesinin herhangi bir konumunda (dizenin başlangıcı ve sonu dahil)

✽ Her iki taraf da bir kelime karakteri olduğunda, örneğin Hi!

Bu pek kullanışlı görünmeyebilir, ancak bazen \ B tam istediğiniz şeydir. Örneğin,

✽ \ Bcat \ B, kediyi sertifikada olduğu gibi tamamen kelime karakterleriyle çevrili olarak bulacaktır, ancak ne kendi başına ne de kelimelerin başında veya sonunda.

✽ kedi \ B, kediyi hem sertifika hem de yayın balığında bulur, ancak ne erkek kedide ne de kendi başına.

✽ \ Bcat kediyi hem sertifika hem de erkek kedide bulacaktır, ancak ne yayın balığı ne de kendi başına.

✽ \ Bcat | cat \ B kediyi gömülü durumda bulur, örneğin sertifika, yayın balığı veya erkek kedide, ancak kendi başına değil.


1

\ b kelime sınırı olarak kullanılır

word = "categorical cat"

Yukarıdaki kelimede tüm "kediyi" bulun

olmadan \ b

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

B ile

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

0

\Bolduğu değil \b örneğin negatif \b

pass-keyburada kelime sınırı yoktur, -bu nedenle \Bilk örneğinizde kedinin yanında kelime sınırı vardır, bu nedenle eşleşir\b

benzer kurallar diğerleri için de geçerlidir. \Wnegatif \w \UPPER CASE, negatiftir\LOWER CASE

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.