2009-03-24 20 views
22

RegExp ile X ve Y arasında bir sayı eşleştirmek istiyorum. Bu mümkün mü?Regexp ile X ve Y arasındaki rakamlar nasıl eşleştirilir?

([0-9] +) herhangi bir sayıyla eşleşecek, örneğin 110 ve 2234 arasındaki bir sayıyı eşleştirmek için nasıl yapabilirim?

+25

Evet mümkündür. Yani ayak tırnaklarınızı çalışan bir testere ile kesiyor. Ne de çok iyi fikirler. – paxdiablo

cevap

45

ve Regex_For_Range adresinden örneğin bir normal ifade oluşturduktan sonra:

\b0*(1[1-9][0-9]|[2-9][0-9]{2}|1[0-9]{3}|2[01][0-9]{2}|22[0-2][0-9]|223[0-4])\b 

işi halleder.

işlem (hala Regex jeneratör izleyen) olması:

Birincisi, eşit uzunlukta girmeye aralıkları:

110 - 999 
1000 - 2234 

İkinci olarak, basit Regexes verim aralıkları girmeye :

110 - 199 
200 - 999 
1000 - 1999 
2000 - 2199 
2200 - 2229 
2230 - 2234 

açın, bir normal ifade her bir aralığı: 10

1[1-9][0-9] 
[2-9][0-9]{2} 
1[0-9]{3} 
2[01][0-9]{2} 
22[0-2][0-9] 
223[0-4] 

azalt bitişik güçleri: 1 [1-9] [0-9] [2-9] [0- 9] {2} 1 [0-9] {3} 2 [01] [0-9] {2} 22 [0-2] [0-9] 223 [0-4]

Yukarıdaki regexlerin birleştirilmesiyle elde edilen değerler:

regex ön eklerine dayalı ağaca
Ayrıştırma:

. 1 [1-9] [0-9] 
+ [0-9]{3} 
+ [2-9] [0-9]{2} 
+ 2 [01] [0-9]{2} 
+ 2 [0-2] [0-9] 
+ 3 [0-4] 

bir içine çözümleme ağacı Torna

0*(1[1-9][0-9]|[2-9][0-9]{2}|1[0-9]{3}|2[01][0-9]{2}|22[0-2][0-9]|223[0-4]) 

Sonraki bir ağaç kullanarak genel önekleri Faktoring çalışacağım regex verimleri:

0*(1([1-9][0-9]|[0-9]{3})|[2-9][0-9]{2}|2([01][0-9]{2}|2([0-2][0-9]|3[0-4]))) 

Sonuç olarak daha kısa olanı seçiyoruz. Eğer (VonC cevap gibi) bazı saçma görünümlü regex ile yapabilirdi iken

\b0*(1[1-9][0-9]|[2-9][0-9]{2}|1[0-9]{3}|2[01][0-9]{2}|22[0-2][0-9]|223[0-4])\b 
+0

A C#/VB.NET/PHP aralığındaki sayılarla eşleşmeyecek veya bilmediklerim dışındaki herhangi bir dil harika olurdu. Hem etkileyici hem de biraz korkutucu için;) – Echilon

+14

+1. – joshin4colours

+0

Bu arada, 000, 001, 010 vb. Eşleşir. – insaner

17

Bu tür ifadeler excel degildir. Büyük olasılıkla /^([0-9]{3,4})$/ rakamlarına sahip olduğunuzdan emin olmak ve daha sonra yakalamaya karşı daha fazla kontrol yapmak daha kolay olacaktır.

3

Her şey güzel olmayabilir.

Belki de bu senin görünümünde projenin kapsamı dışında yatıyor: yeteneği

\b(?:[1][1][0-9]|1\d{3}|223[0-4]|2[0-1]\d\d|2[0-2][0-3][0-4])\b 

Onun regex matematik en düşüncelerini 2006 yılında Phillip Hazel, PCRE'nin yazarı gönderilecektir sayıları metin olarak değil, sayı olarak kabul etmek, bu kesinlikle değerli bir özellik olacaktır. Eşleştirilen basamaklarda bazı temel matematik kontrolleri yapmanıza izin verir, örneğin: 2. eşleştirilmiş rakamın üst veya alt değeri, üçüncü basamağın 1'den çok katı olması ve daha fazla karmaşık durumun yalnızca benim amacımı almak için ayrıntılandırmayacağım genelinde. Bu, metin eşleştirme alanını aşıyor mu?

Evet, sanırım biliyorum ve ayrıca, bu Perl düzenli ifadeler mevcuttur şey değildir:

hangi aşağıdaki cevap var etmek. Bunun yanı PCRE majör olarak Perl, ama hiçbir şey bazı uzantıları var olduğunu biliyoruz (eğer belki çağrılar kullanarak bir şey doğramaya, ama bu hiç şüphesiz son derece dağınık biraz reklam hoc olacağı ve!).

Philip

ve ben daha şimdi `09 anlaşamadılar. Tüm sayıları eşleştir ve eşleşmeyi yaptığınız dilde numara doğrulaması yap. Generate a Regular Expression to Match an Arbitrary Numeric Range göre

+0

Alıntı yazımını düzeltmek istemedim, ancak yanlış yazım memelerinin yayılmasını istemiyorum. – Svante

+0

Bu, 120-199 – insaner

4

, regex gerçekten yönlendirildi-to- için kontrol numarası geciktiremez Neden .. bunu yapmak gerekiyordu değildir senaryo?

numaraları 110-2234 script1 gidin ve 1-109 script2 giderseniz, olurdu pek bir router script tüm sayıları yönlendirmek ve (HTTP yönlendirmesi ile) doğru konuma yönlendirmek için basit ..

.htaccess yılında:

RewriteRule ^view/([0-9]+)/?$ router.php?page=$1 [L] 

..daha sonra router.php içinde, gibi bir şey:

<?PHP 
if(
    int($_GET['page']) > 110 && 
    int($_GET['page']) < 2234 
){ 
    header("Status: 301 Moved Permanently\nLocation: /script1"); 
}else{ 
    header("Status: 404 Not Found"); 
} 
?> 
+0

Bunu biliyorum. Ben .htaccess içinde yapmak ve php yükleme önlemek ve sadece doğru statik dosyayı yüklemek istiyorum :-) – barredo

+0

Ama cevabınız için teşekkürler! :-) – barredo

3

Birlikte aşağıdaki aralıklar için Regexes konabilir:

1[1-9]\d = 110-199 
[2-9]\d\d = 200-999 
1\d\d\d = 1000-1999 
2[0-1]\d\d= 2000-2199 
22[0-2]\d = 2200-2229 
223[0-4] = 2230-2234 

forma: d aracı \

(1[1-9]\d|[2-9]\d\d|1\d\d\d|2[0-1]\d\d|22[0-2]\d|223[0-4]) 

[0-9 ], ancak daha az üç karakterde

İlgili konular