Bir rakamı iki veya dört kez eşleştirmek için normal ifade


96

Normal ifadelerle ilgili basit bir soru, ancak cevabı bulamıyorum.

Bir sayının sırayla tam olarak iki veya dört kez görünüp görünmediğini belirlemek istiyorum . Hangi sözdizimini kullanabilirim?

\d{what goes here?}

Denedim \d{2,4}ama bu ifade üç haneyi de kabul ediyor.


1
Örneğin, iki veya dört basamaklı bir yılı eşleştirmek için .
DavidRR

İf stringinin ne olmasını istiyorsun abc 123 xyz? Sırayla 12tam olarak iki rakam olduğu için eşleşmeli mi? Yoksa kendisi ne 2 ne de 4 uzun olmayan 12daha büyük bir rakam dizisinin parçası olduğu için 123olmamalı mı? Tahmin etmem gerekirse, ikinci davranışı isteyeceğinizi düşünürdüm, ancak sorunuz net değil. Örnekler ve / veya daha net bir spesifikasyon yardımcı olacaktır. Aynı soru abc 12345 def... orada ne olmalı?
Jean-François Corbett

Yanıtlar:


148

Bunun için belirli bir sözdizimi yok, ancak bunu yapmanın birçok yolu var:

(?:\d{4}|\d{2})    <-- alternation: four digits or two
\d{2}(?:\d{2})?    <-- two digits, and optionally two more
(?:\d{2}){1,2}     <-- two digits, times one or two

1
Kişisel olarak, sadece \d{2}(?:\d{2})?çözümü hemen düşündüm - bunların güzel çeşitliliği - özellikle sonuncusu, çok hoş ve ölçeklenebilir görünüyordu.
Nightfirecat

3
+1, önce 4 haneyi, sonra 2 rakamı eşleştirmek için değişim kullanırken gereken sıraya dikkat etmek için. Diğer varyasyonları sağlamak da iyi bir iş.
Ahmad Mageed

9
Benim gibi, bunun kullanımını anlamayan herkes için (?:bir "yakalamayan grup" (bir değiştirme ifadesinde referans gösterilmesi amaçlanmayan bir grup) başlar. Yalnızca parantez de kullanabilirsiniz, ancak bunlar bir yakalama grubu oluşturacaktır. Daha fazla ayrıntı burada: stackoverflow.com/questions/3512471/non-capturing-group
Jeremy Moritz

Bunlar, "333" ve "33" için aynı sonucu gösterecektir
Dan

1
@Dan: Bu normal ifadeler dizenin tamamıyla eşleşmiyor"333" . "Tam dizenin eşleşip eşleşmediğini kontrol et" işlevi yerine, normal ifade kitaplığınızın "eşleşen alt dizeyi bul" işlevini yanlışlıkla kullanıyor olabilirsiniz. Belgelerine bakmalısınız.
ruakh

3
(?<!\d)(\d{2}|\d{4})(?!\d)

Bunu yapmanın doğru yolu budur. Kabul edilen cevap yanlış.

3 rakamla (veya 5) eşleşir. Yani bu benim gözümde yanlış .

1) 2 veya 4 basamaklı bir diziden önce veya iki veya dört basamaklı bir diziden sonra herhangi bir basamak olmadığını kontrol edin.

  • (<!) sözdizimi negatif geriye bakmadır

  • (?!) sözdizimi negatif önden okumadır.

Yukarıdakiler orta dize için çalışacaktır:

Arama dizesi etrafında hiçbir içeriği varsa kullanabilirsiniz ^ve $başlatmak ve dize çapa sonuna:

^\d{4}$|^\d{2}$

1
Kabul edilen cevabın yanlış olduğunu söyleyemem . Söyleyebilirim soru belirsizdir ve bunun cevabın adreslerinin bir geçerli yorumlama söyledi. Cevabınız başka bir geçerli yoruma yöneliktir (daha muhtemel bir yorum olduğunu düşünüyorum - ancak görünüşe göre soruyu soran cevaplamadı ...).
Jean-François Corbett

2
"3 basamakla eşleşir" tam olarak doğru değildir. Sanırım "3 basamaklı bir dizinin 2 basamaklı bir alt dizisiyle eşleşir" demek istiyorsun.
Jean-François Corbett

1
Ayrıca, cevabınız 5 veya daha fazla basamaklı dizilerde amaçlandığı gibi çalışmıyor . Normal ifade uzmanı değilim, ancak bunu düzeltmenin bir yolu , negatif önden / arkaya bakmanın her iki duruma da uygulanmasını sağlamaktır (2 ve 4 basamaklı diziler):(?<!\d)(\d{2}|\d{4})(?!\d)
Jean-François Corbett

5 basamak konusunda haklı olduğunu düşünüyorum. Düzeltme için teşekkürler. Bunu düzeltecek.
JGFMK

^\d{4}$|^\d{2}$bunu düzeltmenin potansiyel bir yolu olabilir. ^\d{2}(?!\d)|^\d{4}(?!\d)
Olacağı
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.