2010-02-02 16 views
5

Art arda artan veya azalan bir dizede ardışık 3 basamaktan oluşan bir sırayla eşleştirmek için bir regex modeline ihtiyacım var. Örneğin3 ardışık basamak için artan veya azalan bir Regex düzeni nedir?

:

Bu dizeler aynı olmalıdır (xxx123xxx, 789xxxxxx, xxxxxx987, xxxxxx432)

Bu dizeler eşleşmemelidir (xxxxxx454, 333xxxxxx, xxx429xxx)

+1

Neden regex gereksinimi? (Bunun çoğu regex lehçesi ile yapılabileceğini sanmıyorum, Perl'in şartlı hükümleri bunu yapabilir). Üç ardışık basamak için daha iyi eşleşmeli ve aralarındaki ilişkiyi filtrelemeli. – Richard

+3

"Artan veya azalan" ifadeleri bu görev için uygun olmayan regex'leri yapar –

+0

Bu, her noktada "durum" gerektiren bir sorundur. Bu sorun için bir durum makinesi (çözümleyici) kullanmayı düşünün. – stusmith

cevap

8

başka hiçbir yolu daha vardır bunları listeleme:

(012|123|234|345|456|567|678|789|987|876|765|654|543|432|321|210) 
+1

Teknik olarak doğru cevap budur, ancak Regex'in görevi yerine getirmenin en iyi yolu olmadığını kabul ediyorum. 3 haneli deseni bulmak için Regex kullanılmalı ve daha sonra 3 basamaklı modelin art arda arttığını/azaldığını bulmak için daha fazla test kullanılmalıdır. – user106776

+0

@ matt.kovacs: Bu harika bir sonuç. – Gumbo

2

Bu çok karmaşık bir ifade olacaktır. Çok benzer bir şey yapmak zorunda olduğum bir projede, eşleşen rakam gruplarını bitirdim ve ardından rakamların gerçek doğrulamasını bir delegeye aktardım (bunu C++ kodunda yapıyordum; Java'da başka bir projede benzer bir şey yapmıştım) aynı yol).

Mümkünse, burada yapmayı önerdiğim şey budur. Bunu tek başlarına yapabilecek bir regex okumak veya korumak için çok zor olacaktır.

3

Bu sadece bitmiş, fakat sadece ardışık rakam

(geçerli setleri tanımlayan ile yapılabilir:? 012 | 210 | 123 | 321 | 234 | 432 | 345 | 543 | 456 | 654 | 567 | 765 678 | 876 | 789 | 987)

İlgili konular