Normal İfade: Olası en küçük eşleşme veya kararsızlık


Yanıtlar:


195

.*Veya gibi normal bir ifade için .+, olabildiğince az karakterle eşleşmesi için bir soru işareti ( .*?veya .+?) ekleyin . Bir bölümü isteğe bağlı olarak eşleştirmek için (?:blah)?ancak kesinlikle gerekli olmadıkça eşleşmeden , gibi bir şey kullanın (?:blah){0,1}?. Yinelenen bir eşleşme için (kullanarak {n,}veya {n,m}sözdizimi) mümkün olduğunca az eşleştirmeye çalışmak için bir soru işareti ekleyin (örneğin {3,}?veya {5,7}?).

Normal ifadeli niceleyicilerle ilgili belgeler de yardımcı olabilir.


7
Bilmiyorum, bu yanlış anlaşılmayı yaşayan tek kişi ben miyim, ancak şunu belirtmek önemlidir: Açgözlü olmayan operatörün mümkün olduğunca az karakterle eşleşeceği doğru olsa da, yine de aradığı eşleşme olmayabilir. için. "Olabildiğince az karakter", RegEx standartlarıyla ilgili "mümkün olan en kısa eşleşme" ye eşit değildir. Yorumumun altındaki yanıta bakın: abcabkve ile a.+?k, RegEx tüm dizeyle eşleşir.
finefoot

Satır2 "ama kesinlikle gerekli olmadıkça eşleşmeden": Bu ne anlama geliyor?
Raining


45

Açgözlü olmayan operatör, mümkün olan en kısa eşleşme anlamına gelmez:

abcabk

a.+?k yalnızca son üç işaret yerine tüm dizeyle eşleşir (bu örnekte).

Bunun yerine mümkün olan en küçük eşleşmeyi bulmak istiyorum.

Bu, ' a' için tüm maçlara hala izin vermek için mümkün olan son maçtır k.

Sanırım bunu yapmanın tek yolu aşağıdaki gibi bir ifadeden yararlanmaktır:

a[^a]+?k


2
Veya eşleşmeler iç içe geçtiğinde sondan başlayarak ters sırada arayın: "(ab (abk) bk)".
LBogaardt

7
@LBogaardt ters sırada nasıl arama yapılır? anlamıyorum
azerafati

2
@LBogaardt Hala açık soru: Ters sırada nasıl arama yapılır? Diyelim ki almak istiyorum cab. Girdiğim ise caaacabve a.*?bararsam, içindeki kısa eşleşme yerine tam dizeyi döndürecektir. Dan geriye doğru nasıl arama yaparım b?
C4d

3
Dizeyi ters çevirin, ardından normal ifadeyi uygulayın.
Jonathan Allen

3
Bu çok faydalıdır. Benim gibi burada neler olup bittiğini anlamaya çalışan insanlar için genel form START[^START]*?END(burada START ve END sizin başlangıç ​​ve bitiş karakter normal ifadelerinizdir). Esasen, "aradaki karakterlerin tekrar
START'ı
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.