SORU
2 Ocak 2009, Cuma


Satır eşleştirmek için düzenli ifade etmiyor't bir kelime içeriyor?

Olası bir kelime maç ve diğer araçlar (örneğin grep -v) kullanarak maçlar ters olduğunu biliyorum. Ancak, mümkünse hatları bu maç için olup olmadığını bilmek istiyorumyokbelirli bir kelime (örn: hede) normal bir ifade kullanarak içerir?

Giriş:

hoho
hihi
haha
hede

# grep "Regex for do not contain hede" Input

Çıkış:

hoho
hihi
haha

CEVAP
2 Ocak 2009, Cuma


Bu düzenli ifade ters eşleme desteklemiyor fikri tamamen doğru değil. Olumsuz bak-alternatif yollarını kullanarak bu davranışı taklit edebilir:

^((?!hede).)*$

Normal ifade üzerinde herhangi bir dize ya da bir satır sonu satır, maç olacakdeğil(alt) dizesini içeren''. hede Belirtildiği gibi, bu bir şey değil düzenli ifade "" (veya yapmalı), ama yine de . iyi ^em>mümkün.

Ve eğer çizgi maç için gerekirse karakter olarak iyi bir iş, DOT-ALL modifier (aşağıdaki desen s firar):

/^((?!hede).)*$/s

yoksa satır içi kullanın:

/(?s)^((?!hede).)*$/

(/.../ nerede normal ifade sınırlayıcıları, yani desenin bir parçası değil)

Eğer NOKTA-değiştirici kullanılabilir durumda değilse, karakter sınıfı ile aynı davranışı [\s\S] taklit:

/^((?!hede)[\s\S])*$/

Açıklama

Bir dize n karakter sadece bir listesidir. Önce ve her karakter sonra, boş bir dize var. n karakter listesi n 1 boş dizeleri olacaktır. Dize "ABhedeCD" düşünün:

     -- --- -- --- -- --- -- --- -- --- -- --- -- --- -- --- -- 
S = |e1| A |e2| B |e3| h |e4| e |e5| d |e6| e |e7| C |e8| D |e9|
     -- --- -- --- -- --- -- --- -- --- -- --- -- --- -- --- -- 

index    0      1      2      3      4      5      6      7

nerede e'boş dizeleri. Normal ifade (?!hede). önde görünüyor, eğer yok alt "hede" görünmek, ve eğer bu durumda (çok başka bir şey görmedim), . (nokta) herhangi bir karakter dışında bir satır sonu. Bak alternatif yollarını da denirsıfır genişlik-iddialaronlar yok çünkütüketmekherhangi bir karakter. Onlar sadece bir şeyi doğrulamak/iddia.

Yani, benim örnekte, her boş dize ilk eğer bir karakter . (nokta) tarafından tüketilen önce 27 ** ileride, eğer orada görmek için doğrulanır. (?!hede). bunu sadece bir kez yapacaksınız, bir grup olarak sarılır ve sıfır veya daha çok kez tekrarlanan bu yüzden düzenli ifade: ((?!hede).)*. Son olarak, başlangıç ve son giriş tüm giriş tüketilen emin olun bağlantılı: ^((?!hede).)*$

Gördüğünüz gibi, giriş "ABhedeCD" e3, (?!hede) başarısız normal ifade, çünkü başarısız olacaktır"hede" ileride!).

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bennythecoder

    Bennythecode

    25 Mart 2008
  • RickardRick

    RickardRick

    9 Mart 2007
  • Vsauce

    Vsauce

    30 Temmuz 2007