Normal ifade: "Boşluk veya dizenin başlangıcı" ve "dizenin boşluğu veya sonu" belirtin


127

"Stackoverflow" ile eşleştirmeye çalıştığınızı hayal edin.

Aşağıdakileri istiyorsunuz:

 this is stackoverflow and it rocks [MATCH]

 stackoverflow is the best [MATCH]

 i love stackoverflow [MATCH]

 typostackoverflow rules [NO MATCH]

 i love stackoverflowtypo [NO MATCH]

Her iki sitede de boşluklar varsa stackoverflow'un nasıl ayrıştırılacağını biliyorum:

/\s(stackoverflow)\s/

Bir dizenin başında veya sonunda olmasıyla aynı:

/^(stackoverflow)\s/

/\s(stackoverflow)$/

Ancak normal bir ifade kullanarak "boşluk veya dizenin sonu" ve "boşluk veya dizenin başlangıcı" nı nasıl belirtirsiniz?

Yanıtlar:


172

Aşağıdakilerden herhangi birini kullanabilirsiniz:

\b      #A word break and will work for both spaces and end of lines.
(^|\s)  #the | means or. () is a capturing group. 


/\b(stackoverflow)\b/

Ayrıca, eşleşmenize boşluk eklemek istemiyorsanız, arkaya / önden bak kullanabilirsiniz.

(?<=\s|^)         #to look behind the match
(stackoverflow)   #the string you want. () optional
(?=\s|$)          #to look ahead.

8
\bsıfır genişlikli bir iddiadır; asla herhangi bir karakter tüketmez. Etrafa bakmanıza gerek yok.
Alan Moore

2
Not çoğu regexp'in uygulamalarda, yani \bolduğu yalnızca standart ASCII , hiçbir Unicode desteği demek ki. Unicode kelimeleri eşleştirmeniz gerekiyorsa, bunun yerine bunu kullanmaktan başka seçeneğiniz yoktur: stackoverflow.com/a/6713327/1329367
Mahn

4
Grup seçimini maçın dışında tutmanın daha kolay yolu(?:^|\s)
user2426679

7
piton için, yerini (?<=\s|^)ile (?:(?<=\s)|(?<=^)). Aksi takdirde, şunu elde edersinizerror: look-behind requires fixed-width pattern
user2426679

4
\bÖrneğin "olarak - diğer karakterler ele alacak .boşluk" "asker özellikle söz konusu ise, kelime bozucu olarak". @ gordy'nin çözümü daha iyi görünüyor.
Mikhail T.

66

(^|\s)boşluk veya dize başlangıcı ve ($|\s)boşluk veya dize sonu ile eşleşir . Birlikte:

(^|\s)stackoverflow($|\s)

4
bu benim için çalışan tek şey. teşekkür ederim @gordy
robsonrosa

2
Değiştirmek için bu deseni kullanırsanız, desenle değiştirerek değiştirilen sonuçtaki boşlukları tutmayı unutmayın $1string$2.
Mahn

Benim için de işe yarayan tek kişi bu. Kelime sınırları asla istediğimi yapmıyor gibi görünüyor. Birincisi, boşlukların yanı sıra (kısa çizgiler gibi) bazı karakterlerle eşleşirler. Bu benim koymak için çalışıyor etmişti çünkü benim için çözüldü $ve ^bir karakter sınıfa, ancak bu gösterileri onlar sadece normal bir desen gruba konabilir.
felwithe

18

İşte kullanacağım şey:

 (?<!\S)stackoverflow(?!\S)

Başka bir deyişle, önünde boşluk olmayan bir karakter yoksa ve ardından boşluk olmayan bir karakter gelmiyorsa "stackoverflow" ile eşleşir .

Bu, "boşluk veya çapa" yaklaşımından daha nettir (IMO) ve \byaklaşımın yaptığı gibi dizenin kelime karakterleriyle başlayıp biteceğini varsaymaz .


1
bunun neden kullanılacağına dair iyi bir açıklama. Bunu seçerdim ancak test edilen dizi HER ZAMAN tek bir satırdır.
anonim-bir

7

\b kelime sınırlarında eşleşir (aslında hiçbir karakterle eşleşmez), bu nedenle aşağıdakiler istediğinizi yapmalıdır:

\bstackoverflow\b

Python için ham bir dizge belirtmeye yardımcı olur , örneğinmystr = r'\bstack overflow\b'
Acumenus
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.