Belirli bir kelimeyle eşleşmesi için nasıl normal ifade yazmalıyım?


21

Belirli bir normal regex çalışmaya çalışıyorum ama ihtiyacım olanı yapmak için alamıyorum.

Temel olarak, ROCKET aramasını istiyorum. Normal ifade, üst veya alt durumlarda ve noktalama işaretli veya işaretsiz ROCKET ile eşleşmelidir, ancak başka bir kelimenin parçası olduğunda değil. Yani, normal ifade bunlardan herhangi birini tetikleyecektir:

rocket
RoCKEt
hi Rocket
This is a rocket.
ROCKET's engine

ancak ROCKET üzerinde böyle bir şey bulunduğunda tetiklemeyin.

Rocketeer
Sprocket

Çevrimiçi regex jeneratör kullanarak doğru almaya çalışıyorum ama tam olarak eşleşmesini sağlayamıyorum.


1
Bu, sorunun Yığın Taşması için daha uygun olabileceği [nadir] durumlardan biridir. Her dilin kendine özgü özellikleri olduğundan bir dil ve / veya platform sağladığınızdan emin olun. Örneğin, Windows. .Net ve Regex sınıfı . (Genellikle, bunun tersi de geçerlidir. Stack Overflow, Süper Kullanıcı için daha uygun geliştiricilerden yüzlerce konu dışı soru alır).
jww

Yanıtlar:


14

MSDN Düzenli İfade Hızlı Referansı'na yer işareti koymanızı öneririm

alfasayısal olmayan karakterlerle çevrili "roket" kelimesi için büyük / küçük harfe duyarlı olmayan bir eşleşme elde etmek istiyorsunuz. İşe yarayacak bir normal ifade:

\W*((?i)rocket(?-i))\W*

Yapacağı şey, sıfır veya daha fazla (*) alfasayısal olmayan (\ W) karakter, ardından roket ((? İ) roketinin (? - i)) büyük / küçük harf duyarlı olmayan bir versiyonunu, ardından tekrar sıfır veya daha fazla ( *) alfasayısal olmayan karakterler (\ W). Roket eşleme terimi etrafındaki fazladan parantezler eşleşmeyi ayrı bir gruba atar. Roket kelimesi eşleşme grubu 1'de olacaktır.

GÜNCELLEME 1: Matt yorumda bu normal ifadenin python'da kullanılması gerektiğini söyledi. Python'un biraz farklı bir sözdizimi vardır. Python'da aynı sonucu elde etmek için bu normal ifadeyi kullanın ve re.IGNORECASEseçeneği compileveya matchişlevine iletin.

\W*(rocket)\W*

On Regex101 bu "i" metin kutusuna sonraki regex girişine girerek simüle edilebilir.

GÜNCELLEME 2 Ismael, normal ifadenin "1rocket1" ile eşleşebileceğinden oldukça doğru olmadığını belirtti. Çok daha iyi bir çözüm gönderdi, yani

(?:^|\W)rocket(?:$|\W)


1
Bunu çevrimiçi regex testçileri ile test etmek ( örneğin regex101.com ), geçersiz ve girdiğim örnek dizelerle eşleşmediğini gösterir. Bu, bir python betiğinin parçası olarak kullanılmak üzere tasarlanmıştır. Bu nasıl yazılması gerektiği konusunda bir fark yaratıyor mu?
Kefka

1
Evet öyle. regex101.com'da sol üstte bir regex "lezzet" seçebileceğinizi görebilirsiniz, python biraz farklıdır. Cevabımı python eşdeğeri ile güncelleyeceğim.
Xaser

1
Teşekkürler. Normal ifadelerin temel olarak dilden bağımsız olduğunu düşündüm.
Kefka

1
Olmaları gerekir, ancak küçük uygulama farklılıkları vardır.
Xaser

2
Ve \W*(rocket)\W*maçlar lrocketl. Olmalıdır (?:^|\W)(rocket)(?:$|\W)(olmadan *ve dizenin başlangıcı ve / veya sonu ile eşleşip eşleşmediğini kontrol etmeniz gerekir).
Ismael Miguel

10

Bence bu durumda görünümler aşırıya kaçmış ve ignorecaseseçenekle birlikte kelime sınırlarını kullanmak daha iyi olurdu ,

\brocket\b

Başka bir deyişle, python'da:

>>> x="rocket's"
>>> y="rocket1."
>>> c=re.compile(r"\brocket\b",re.I)  # with the ignorecase option
>>> c.findall(y)
[]
>>> c.findall(x)
['rocket']

teknik olarak, yakalamayan gruplar bir bakış açısı değildir, ancak / b seçeneği Ismael'in çözümü ile aynı sonucu verir, ancak biraz daha zarif olabilir.
Xaser

1

İle grepve sed, kullanabilirsiniz \<rocket\>. İle grep, -iopsiyon harf büyüklüğüne duyarsızdır (yapacaktır i dava gnore):

grep -i '\<rocket\>'

Tüm normal sedifadeleri büyük / küçük harfe duyarsız hale getirmenin bir yolunu bilmiyorum , ancak her zaman mağara adamı yolu var:

sed -n '/\<[Rr][Oo][Cc][Kk][Ee][Tt]\>/p'

0

Yalnızca tam sözcükleri ara seçeneğini kullanın.

Noktalamalara kadar, lezzet / lezzet bilene kadar cevap veremezsiniz.

Çok eski bir iş parçacığı, bu nedenle daha sonra bir ihtiyaç ile ziyaret edebilecek biri için gönderildi. Konuyu başlatanlar başka bir şeye taşınmış olabilirler ... Hayır?


Ne whole words only optionkullanıyor grepveya php? Maalesef, cevabınız diğer cevaplara kıyasla herhangi bir katma değer vermiyor.
Toto
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.