Normal ifade ileri, göz ve atom grupları


314

Bunları normal ifadeler bedenimde buldum ama ne için kullanabileceğime dair bir fikrim yok. Nasıl çalıştığını anlayabilmem için birisinin örnekleri var mı?

(?!) - negative lookahead
(?=) - positive lookahead
(?<=) - positive lookbehind
(?<!) - negative lookbehind

(?>) - atomic group

18
Neden regex web sitesinde böyle basit bir tablo yok? Bunun yerine sadece açıklayan metin blokları var. regular-expressions.info/lookaround.html
Whitecat

3
@Whitecat deneyin: regex101.com regexr.com
Andrew

Yanıtlar:


852

Örnekler

Dize verildiğinde foobarbarfoo:

bar(?=bar)     finds the 1st bar ("bar" which has "bar" after it)
bar(?!bar)     finds the 2nd bar ("bar" which does not have "bar" after it)
(?<=foo)bar    finds the 1st bar ("bar" which has "foo" before it)
(?<!foo)bar    finds the 2nd bar ("bar" which does not have "foo" before it)

Bunları da birleştirebilirsiniz:

(?<=foo)bar(?=bar)    finds the 1st bar ("bar" with "foo" before it and "bar" after it)

Tanımlar

Olumlu bak (?=)

B ifadesinin takip ettiği A ifadesini bulun:

A(?=B)

Geleceğe bak negatif (?!)

B ifadesinin takip etmediği A ifadesini bulun:

A(?!B)

Olumlu arkasına bak (?<=)

B ifadesinin önünde bulunduğu A ifadesini bulun:

(?<=B)A

Negatifin arkasına bak (?<!)

B ifadesinin önünde olmadığı A ifadesini bulun:

(?<!B)A

Atom grupları (?>)

Bir atomik grup bir gruptan çıkar ve grup içindeki ilk eşleşen desenden sonra alternatif desenleri atar (geri izleme devre dışı bırakılır).

  • (?>foo|foot)siçin uygulanan footsilk alternatifiyle eşleşir, hemen takip etmediği foogibi başarısız olur sve geri izleme devre dışı bırakıldığından durur

Atomik olmayan bir grup geri izlemeye izin verir; ilerideki eşleştirme başarısız olursa, tüm ifade için bir eşleşme bulunana veya tüm olasılıklar tükenene kadar geri döner ve alternatif desenler kullanır.

  • (foo|foot)sfootsiradesine uygulandı :

    1. 1. alternatifini eşleştirin foo, ardından shemen takip etmediği gibi başarısız footsolun ve 2. alternatifine geri dönün;
    2. 2. alternatifini eşleştirin foot, ardından shemen aşağıdaki şekilde başarılı olun footsve durun.

Bazı kaynaklar

Çevrimiçi test kullanıcıları


1
"İkinci çıtayı bulur" kısmı ile ne demek istiyorsun? İfadede / dizede yalnızca bir çubuk vardır. Teşekkürler
ziggy

2
@ziggy test edilen dize "foobarbarfoo" dur. Gördüğünüz gibi ipte iki foo ve iki çubuk var.
skyfoot

4
Birisi ne zaman bir atom grubuna ihtiyaç duyabileceğini açıklayabilir mi? Sadece ilk alternatifle eşleşmem gerekirse, neden birden fazla alternatif vermek isteyeyim?
arviman

2
Atom grubu hakkında daha iyi açıklama olarak bu cevap . Bu didaktik cevabı tamamlamak için burada birisi düzenleyebilir mi?
Peter Krauss

5
Ciddi regex pirzola gerektiren bir projeye son verdiğimde bu cevabın gerekli olduğunu unutmayın. Bu, etrafa bakmanın mükemmel ve özlü bir açıklamasıdır.
Tom Coughlin

215

Lookaround'lar sıfır genişlik iddiasıdır. Bir regex (mevcut pozisyonun sağına veya soluna doğru - ileri veya arkaya dayalı olarak) kontrol ederler, bir eşleşme bulunduğunda (pozitif veya negatif olmasına bağlı olarak) başarılı veya başarısız olurlar ve eşleşen kısmı atarlar. Herhangi bir karakter tüketmezler - onları takip eden normal ifade eşleşmesi (varsa) aynı imleç konumunda başlar.

Okuma Daha fazla bilgi için regular-expression.info sayfasını .

  • Olumlu bakış:

Sözdizimi:

(?=REGEX_1)REGEX_2

Yalnızca REGEX_1 eşleşirse eşleşir; REGEX_1 eşleştirildikten sonra maç atılır ve REGEX_2 araması aynı konumda başlar.

misal:

(?=[a-z0-9]{4}$)[a-z]{1,2}[0-9]{2,3}

REGEX_1, [a-z0-9]{4}$dört alfasayısal karakter ve ardından satır sonu ile eşleşir.
REGEX_2, [a-z]{1,2}[0-9]{2,3}bir veya iki harf ve ardından iki veya üç basamakla eşleşir.

REGEX_1, dize uzunluğunun gerçekten 4 olduğundan emin olur, ancak REGEX_2 aramasının aynı yerde başlaması için herhangi bir karakter tüketmez. Şimdi REGEX_2, dizenin diğer bazı kurallarla eşleştiğinden emin olur. İleriye bakmadan, üç veya beş uzunluktaki dizelerle eşleşir.

  • Olumsuz bakış

Sözdizimi:

(?!REGEX_1)REGEX_2

Yalnızca REGEX_1 eşleşmiyorsa eşleştirin; REGEX_1 kontrol edildikten sonra REGEX_2 araması aynı konumda başlar.

misal:

(?!.*\bFWORD\b)\w{10,30}$

Önden bakma parçası, dizgideki ini denetler FWORDve bulursa başarısız olur. O bulamazsa FWORD, ileriye bakma başarılı ve dizi 'uzunluğu 10 ile 30 arasında olduğunu aşağıdaki parça doğrular ve sadece kelime karakterleri içerdiğinia-zA-Z0-9_

Geriye bakma, ileriye bakmaya benzer: sadece geçerli imleç konumunun arkasına bakar. Javascript gibi bazı regex lezzetleri, geriye dönük iddiaları desteklemez. Ve onu destekleyen çoğu lezzet (PHP, Python vb.), Arka kısmın sabit bir uzunluğa sahip olmasını gerektirir.

  • Atom grupları temel olarak bir token eşleştikten sonra gruptaki sonraki simgeleri atar / unutur. Atomik grup örnekleri için bu sayfayı kontrol edin

açıklamanızın ardından javascript, /(?=source)hello/.exec("source...hummhellosource ") = null olarak çalışmıyor gibi görünüyor. Açıklamanız doğru mu?
Helin Wang

@HelinWang Bu açıklama doğrudur. Normal ifadeniz aynı anda hem kaynak hem de merhaba olan bir dize bekliyor!
Amarghosh

@jddxf Ayrıntılara dikkat etmek ister misiniz?
Amarghosh

@Amarghosh Katılıyorum "Regex (mevcut pozisyonun sağına veya soluna doğru - ileri veya geri dayalı olarak), bir maç bulunduğunda (pozitif veya negatif olmasına bağlı olarak) başarılı veya başarısız olurlar ve eşleşenleri atarlar bölümü. ". Dolayısıyla, ileriye doğru geçerli konumun sağına doğru bir düzenli ifade olup olmadığını kontrol etmeli ve pozitif
ileriye

@Amarghosh (?=REGEX_1)REGEX_2sadece sonraREGEX_2 gelirse eşleşir mi? REGEX_1
aandis

0

Grokking bakış açısı hızla.
İleri ve geriye doğru nasıl ayırt edilir? Benimle 2 dakika tur atın:

(?=) - positive lookahead
(?<=) - positive lookbehind

varsaymak

    A  B  C #in a line

Şimdi B'ye soruyoruz, neredesin?
B'nin yerini bildirmek için iki çözümü vardır:

Bir, B'nin A önde ve C'nin Bb olması
İki, B C'nin önünde (arkası) ve A'nın arkasındadır (A).

Gördüğümüz gibi, arkada ve önde iki çözümde zıttır.
Regex, İkinci çözümdür.

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.