Şu normal ifadeyi düşünün X
olan herhangi regex.
X{n}|X{m}
Bu normal ifade, tam olarak veya kez X
oluşup oluşmadığını test eder . n
m
Bir oluşumu X
tam olarak n
veya m
kez test edebilen bir normal ifade nicelik belirteci var mı ?
Şu normal ifadeyi düşünün X
olan herhangi regex.
X{n}|X{m}
Bu normal ifade, tam olarak veya kez X
oluşup oluşmadığını test eder . n
m
Bir oluşumu X
tam olarak n
veya m
kez test edebilen bir normal ifade nicelik belirteci var mı ?
(X)\1{n-1}(?:\1{m-n-1})
. Bunun X
en az bir kez eşleştiğini biliyorum , ancak sadece başlamak için bu basit şeyi deneyin, ardından bunun yerine önden veya arkaya bakmayı kullanarak hassaslaştırın (X)
.
Yanıtlar:
"Tam olarak m veya n kez" anlamına gelen tek bir nicelik belirteci yoktur. Yapma şeklin iyi.
Bir alternatif şudur:
X{m}(X{k})?
nerede m < n
ve k
değeridir n-m
.
Nicelik belirteçlerinin tam listesi (ref. Http://www.regular-expressions.info/reference.html ):
?
, ??
- 0 veya 1 oluşum ( ??
tembel, ?
açgözlü)*
, *?
- herhangi bir sayıda oluşum+
, +?
- en az bir kez{n}
- tam olarak n
oluşumlar{n,m}
- n
için m
bulunuşu, kapsayıcı{n,m}?
- n
için m
bulunuşu, tembel{n,}
, {n,}?
- en azından n
oluşum"Tam olarak N veya M" elde etmek için, ölçülen normal ifadeyi iki kez yazmanız gerekir, m, n özel değilse:
X{n,m}
Eğer m = n+1
(?:X{n}){1,2}
Eğer m = 2n
?:
If m = 2n
örneğinde neden gerekli ? Benim için onsuz iyi çalışıyor gibi görünüyor.
?:
, grup bir yakalama grubu haline gelir. Düzenli ifade motorunun gerekmeyen şeyleri hatırlamasının yanı sıra, bundan sonra grupları yakaladıysanız, kimlikleri değişecektir. Normal ifadenizi değiştirme için kullanırsanız, değiştirmeyi ayarlamanız gerekir.
Hayır, böyle bir nicelik belirteci yok. Ama geri dönüşte sorunları/X{m}(X{m-n})?/
önlemek için yeniden yapılandırırdım .
TLDR; (?<=[^x]|^)(x{n}|x{m})(?:[^x]|$)
İstediğiniz gibi görünüyor "xn kez" veya "xm kere" Ben regex bir edebi çeviri olacağını düşünüyorum (x{n}|x{m}).
Bunun gibi https://regex101.com/r/vH7yL5/1
veya m "x" s'den daha büyük bir diziye sahip olabileceğiniz bir durumda (m> n varsayılırsa), "x" olmadan "x" ve ardından "x" yok, çeviri yaparak ekleyebilirsiniz, [^x](x{n}|x{m})[^x]
ancak bu "x" lerin arkasında ve arkasında her zaman bir karakter olduğunu varsayın. Burada görebileceğiniz gibi: https://regex101.com/r/bB2vH2/1
Eğer bunu değiştirebilir (?:[^x]|^)(x{n}|x{m})(?:[^x]|$)
"hayır 'x' veya satır sonuna kadar takip ardından" " 'x' hayır şu veya satır başlangıç aşağıdaki" ve tercüme. Ancak yine de, burada görebileceğiniz gibi, aralarında yalnızca bir karakter bulunan iki diziyi eşleştirmeyecektir (çünkü ilk eşleşme sonrasında bir karakter ve ikincisi daha önce bir karakter gerektirecektir): https://regex101.com/r/ oC5oJ4 / 1
Son olarak, bir karakterlik uzak eşleşmeyi eşleştirmek için, "sonra 'x' yok" üzerine olumlu bir ön bakış (? =) Veya "önce 'x' yok" üzerine olumlu bir bakış (? <=) Ekleyebilirsiniz, şunun gibi: https://regex101.com/r/mC4uX3/1
(?<=[^x]|^)(x{n}|x{m})(?:[^x]|$)
Bu şekilde, yalnızca istediğiniz 'x'lerin tam sayısını eşleştireceksiniz.
Enhardened'ın cevabına bir göz atarak, sondan bir önceki ifadelerinin aralarında yalnızca bir karakter bulunan dizilerle eşleşmeyeceğini belirtiyorlar. İleriye bakma / arkaya bakma özelliğini kullanmadan bunu düzeltmenin kolay bir yolu var ve bu başlangıç / bitiş karakterini sınır karakteriyle değiştirmektir. Bu, başlangıç / bitiş dahil olmak üzere kelime sınırlarıyla eşleşmenizi sağlar. Bu nedenle, uygun ifade şöyle olmalıdır:
(?:[^x]|\b)(x{n}|x{m})(?:[^x]|\b)
Burada görebileceğiniz gibi: https://regex101.com/r/oC5oJ4/2 .
Çok eski bir gönderi, ancak yardımcı olabilecek bir şeyle katkıda bulunmak istiyorum. Bunu tam olarak soruda belirtilen şekilde denedim ve işe yarıyor ama bir sorun var: Miktarların sırası önemlidir. Bunu düşün:
#[a-f0-9]{6}|#[a-f0-9]{3}
Bu, tüm onaltılık renk kodlarını bulacaktır (bunlar ya 3 ya da 6 basamak uzunluğundadır). Ama bunu böyle çevirdiğimde
#[a-f0-9]{3}|#[a-f0-9]{6}
sadece 3 rakamlı olanları veya 6 haneli olanların ilk 3 rakamını bulacaktır. Bu mantıklı ve bir Regex uzmanı bunu hemen fark edebilir, ancak çoğu kişi için bu tuhaf bir davranış olabilir. Sırası ne olursa olsun bu tuzağı engelleyebilecek bazı gelişmiş Regex özellikleri vardır, ancak herkes Regex kalıplarına diz boyu hakim değildir.
X
genel için alabilirsiniz en iyisim
,n
.