2017-07-29 43 views
6

używam następujący kod:Regex wyrażenie E.164 nie działa

Pattern p = Pattern.compile("^\\+?[1-9]\\d{1,14}$"); 
    stringNumber=stringNumber.replace(" ",""); 
    Matcher m = p.matcher(stringNumber); 


    if (!m.matches()) 
    { 
    [...] 
    } 

i wzór, który ma prawidłowo wykryć numerów w formacie E.164, nie działa tak myślę, Powinien, jako że nadaje jako numer telefonu E.164, numer w formacie XXXXXXXXX, będący X-cyfrą od 0 do 9. I chociaż patrzę na wzór, nie mogę zrozumieć, dlaczego.

Mniej restrykcyjny wzór "^ \ +? \ D {10,14} $" działa, ponieważ wykrył, że liczba XXXXXXXXX nie pasuje do formatu.

Być może ostatni wzór jest wystarczający do moich celów aplikacji, ale chciałbym użyć pierwszego (który może określić, że numer telefonu jest w formacie E.164 w każdym przypadku) tylko po to, aby uzyskać szerszy zakres możliwości, nawet jeśli te możliwości są rzadkie.

Co może być przyczyną nieoczekiwanego zachowania przy pierwszym wzorcu?

+0

Czy istnieje jakiś powód, dla którego XXXXXXXXX nie może zostać zaakceptowany przez twój wzór? – TomekK

+0

@TomekkK, tylko z + na wzorze Myślę, że nie powinien on pasować do tego wzorca, i mimo to tak się dzieje. – user2638180

+0

chcesz mieć '+' z przodu wymagane? – tima

Odpowiedz

4

Aby numer był + z przodu, twoje wyrażenie regularne powinno być ^\\+[1-9]\\d{1,14}$. Zauważ, że usunięcie ? oznaczało, że + było opcjonalne.

Powód, dla którego drugi wzór nie pasował do danych wejściowych, nie wynikał z +, ale dlatego, że drugi wzór wymaga co najmniej 10-cyfrowej liczby, a przykład dotyczy 9 ​​cyfr.

+0

Masz rację, zapomniałem o? – user2638180

Powiązane problemy