2015-04-16 14 views
6

tüm kelimeleri değiştirerek değil yerine Regex ve işe alınamıyor: AşağıdakiJava bütün Yıllardır Java bu regex ile oynuyorum

(?:^|)(?:the|and|at|in|or|on|off|all|beside|under|over|next)(?: |$) 

:

pattern.matcher("the cat in the hat").replaceAll(" ") 

verir bana cat the hat. Başka bir örnek girdi cat of next hat bana the cat in of the next hat olduğunu.

Her bir sözcük için bunları birden çok ayrı regex'e ayırmak zorunda kalmadan bu regex değiştirme işini yapmanın bir yolu var mı ve bir dizeyi tekrar tekrar değiştirmeyi denedim mi? ,

\b(?:the|and|at|in|or|on|off|all|beside|under|over|next)\b 

Sizin orijinal yakalamak vermedi: Sadece bu yerine do (?:^|):

cevap

10

Evet, sen sadece birlikte tarif etmek çalıştığımız şey olan boundaries kullanmaya gerek oldukça kolay yapabilirsiniz yorumlarda gibi seçenekler yakalamak istiyorsanız, bunun yerine olmayan bir yakalama grubunun bir yakalama kullanabilirsiniz:

\b(the|and|at|in|or|on|off|all|beside|under|over|next)\b 
+0

Ayrıca eşleşme gruplarına da ihtiyacınız olabilir: '(\ b (?: | ve | at | in | ya da | on | off | all | yanında | under | over | next) \ b) ' – frhd

+1

: '\ b (| ve | at | in | veya | on | off | all | beside | under | over | next) \ b' – sp00m

+0

@ sp00m yep, bu yanıt düzeltmenizle birlikte güncellenmelidir. – frhd

5

sizinkiyle sorun baştaki ve sondaki boşluklar dahil olmasıdır eşleşir ve bir char iki maçta bulunamaz.

giriş the_cat_in_the_hat Yani (alt çizgi açıklamayı daha açık hale getirmek için, burada boşlukların yerine):

  1. İlk maç: the_ kalan dizesi: cat_in_the_hat
  2. İkinci maç: _in_ kalan dizesi: (Boşluk) dizgesinin başlangıcına ya da bir boşluğa göre önceliği yapılmadığından, eşleştirilmemiş the_hat
  3. .

onlar (yani if) koşulları gibi davranırlar beri yerine lookarounds kullanmış olabilir:

(?<=^|)(?:the|and|at|in|or|on|off|all|beside|under|over|next)(?= |$) 

Regular expression visualization

Debuggex Demo

Bu şekilde, olurdu:

  1. İlk maç: the kalan dizesi: _cat_in_the_hat
  2. İkinci maç: in kalan dizesi: _the_hat
  3. Üçüncü maç: the kalan dizesi: _hat

Ama @JonathanMee answer en iyi çözümdür, kelime beri Sınırlar bu amaç için tam olarak uygulandı;)

+1

Bu, sorunun mükemmel bir açıklaması, son çözümümü tercih ediyorum, ama +1, çünkü bu daha iyi bir yanıt veriyor. –

+2

Nice eğer iki cevabı kabul edersem olurdum! – RTF