2011-07-29 10 views

Odpowiedz

11

pasujące do kolejnych samymi cyframi:

^([0-9])\1*$ 

pamiętać, że Muszę uciec z ukośnika odwrotnego, gdy umieścisz go w literale ciągów java, np "^([0-9])\\1*$".

W drugim należy jawnie utworzyć listę kolejnych cyfr za pomocą operatora |. Regex byłby naprawdę długi i nieprzyjemny z aż dziesięcioma zagnieżdżonymi parantezami. Trzeba wygenerować to wyrażenie za pomocą programu. Innymi słowy, jest to niewłaściwy problem do rozwiązania przy użyciu regex. Łatwiej byłoby napisać pętlę i przetestować to.

+0

Tak, masz rację. Rozwiązywanie problemów z RegEx jest naprawdę nieprzyjemne. Rozwiązałem go z dobrym starym przyjacielem do pętli. Dzięki za pomoc. – yyy

+0

@SusamPal, (4 lata później ...) fajnie (+1)! proszę zobaczyć moją odpowiedź na sekundę. – JJoao

1

Ten wzór będzie pasował jeśli użytkownik wpisze taką samą cyfrę:

^(\d)\1*$ 

\1 mecze pierwszej grupy przechwytywania, więc pasuje do wzorca, czy ta pierwsza cyfra jest powtarzany dla całego łańcucha.

Drugi problem (kolejne cyfry) jest nieco trudniejszy.

^(?:^(?:^(?:^(?:^0?1)?2)?3)4?)?5(?:$|6(?:$|7(?:$|8(?:$|90?))))$| 
    ^(0?1)?2(?:$|3(?:$|4))|^(6?7)?8(?:$|90?)$ 

to jedna z realizacji, przyjmująca trzy lub więcej cyfr. Ale ponieważ liczba kombinacji jest niewielka, wyliczając (4+ cyfr) możliwe jest również:

^(?:0?123(45?)?|1?23456?|2?34567?|3?45678?|4?56789?|(5?6)?7890?| 
     (0?1)?2345678?(90$)?|1?23456789?|2?345678(90?)?)$ 

Wszystko to powiedział, wyrażenia regularne nie zawsze działa dobrze dla tego typu problemu. Metoda Java do sprawdzenia tej sekwencji może być czystsza.

+0

Drugie wyrażenie nie pasuje do ciągów takich jak "123", "345" itp. Edycja: OK, teraz widzę, że założyłeś "6 cyfr". –

+0

dziękuję Susam, widziałem, że 6 cyfr nie było wymogiem i zmieniono post, aby był bardziej ogólny. – drf

+0

rozwiązuje, jeśli numer zaczyna się od 0 lub 1, myślę. Dla pętli była bardzo przydatna. Thanx przy okazji. – yyy

0

Tym razem w Perlu, aby wyjaśnić drugi przypadek łatwiej:

perl -nlE 'say "BAD number" if ($_ =~ /^(\d)\1*$/ or "123456789" =~ /$_/)' 

Objaśnienie:

  • Przypadek 1: Wejście ∈ /(\d)\1*/ język: już przedstawione ($_ =~ /^(\d)\1*$/)
  • Przypadek 2: ciąg znaków "123456789" odpowiada wprowadzeniu ("123456789" =~ /$_/)
Powiązane problemy