Chcę napisać wyrażenie regularne dla standardowego numeru telefonu typu US, który obsługuje następujące formaty:
###-###-####
(###) ###-####
### ### ####
###.###.####
gdzie # oznacza dowolną liczbę. Do tej pory wymyśliłem następujące wyrażenia
^[1-9]\d{2}-\d{3}-\d{4}
^\(\d{3}\)\s\d{3}-\d{4}
^[1-9]\d{2}\s\d{3}\s\d{4}
^[1-9]\d{2}\.\d{3}\.\d{4}
odpowiednio. Nie jestem do końca pewien, czy ostatnia z nich jest poprawna do wykropkowanej kontroli. Chciałbym również wiedzieć, czy jest jakikolwiek sposób, abym mógł napisać jedno wyrażenie zamiast 4 różnych, które obsługują różne formaty, o których wspomniałem. Jeśli tak, nie jestem pewien, jak to zrobić. A także, jak zmodyfikować wyrażenie / wyrażenia, aby można było również dołączyć warunek do obsługi numeru kierunkowego jako składnik opcjonalny. Coś jak
+1 ### ### ####
gdzie +1 to numer kierunkowy i jest opcjonalny.
Odpowiedzi:
Pasuje do następujących
Jeśli nie chcesz dopasować numerów spoza Stanów Zjednoczonych, użyj
Aktualizacja:
Jak zauważył użytkownik Simon Weaver poniżej, jeśli interesuje Cię również dopasowywanie niesformatowanych liczb, po prostu ustaw klasę znaku separatora jako opcjonalną, ponieważ
[\s.-]?
źródło
?
Nie stosuje się na nawiasie()
, a nie cyframi. Kompletne powiązane wyrażenie regularne to\(?\d{3}\)?
.\d{3}
określa, że między znakami,()
które są (uczynione) opcjonalnymi (przez?
), muszą istnieć trzy cyfry .?
po każdym,[\s.-]
aby było opcjonalne^(\+\d{1,2}\s)?((\(\d{3}\))|(\d{3}))[\s.-]\d{3}[\s.-]\d{4}$
. (Po prostu zduplikowałem segment RegEx, który obejmuje numer kierunkowy i pozwoliłem na jeden wariant z parenami i jeden bez)Istnieje wiele możliwych wariantów tego problemu. Oto wyrażenie regularne podobne do odpowiedzi, którą wcześniej umieściłem na SO.
Pasowałoby do poniższych przykładów i nie tylko:
Niezależnie od sposobu wprowadzenia numeru telefonu, grupy przechwytywania mogą służyć do podziału numeru telefonu, aby można go było przetworzyć w swoim kodzie.
Oto podział wyrażenia, jeśli jesteś zainteresowany:
Aby numer kierunkowy był opcjonalny, po prostu dodaj znak zapytania po (\ d {3}) dla numeru kierunkowego.
źródło
\s
nie są potrzebne na początku i na końcu, ponieważ używam do walidacji, a pole jest już przycięte.^(\+\d{1,2}\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$
Pasuje do tych numerów telefonów:
Zobacz regex101.com
źródło
Oto dość kompaktowy, który stworzyłem.
Przetestowano w następujących przypadkach użycia.
źródło
Dodanie przykładu wykorzystującego powyższe rozwiązania na jsfiddle. Zmodyfikowałem nieco kod zgodnie z wymaganiami moich klientów. Mam nadzieję, że to też komuś pomoże.
Zobacz przykład tutaj
źródło
spróbuj tego dla użytkowników z Pakistanu. Oto dość kompaktowy, który stworzyłem.
Przetestowano w następujących przypadkach użycia.
źródło
Numer telefonu, którego używam:
/^[+]?(\d{1,2})?[\s.-]?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$/
Okładki:
źródło
Wyrażenia dla 1, 3 i 4 są dość podobne, więc możesz użyć:
Zwróć uwagę, że w zależności od używanego języka i marki wyrażeń regularnych może być konieczne wstawienie
\2
zamiast$2
lub takie dopasowanie może w ogóle nie być obsługiwane.Nie widzę dobrego sposobu na połączenie tego z formatem 2, poza oczywistością
^(regex for 1,3,4|regex for 2)$
który jest brzydki, niezdarny i sprawia, że trudno jest wydobyć części liczb.Jeśli chodzi o numer kierunkowy, możesz dodać
(\+\d)?
na początku, aby uchwycić jednocyfrowy numer kierunkowy (przepraszam, nie znam formatu twoich numerów kierunkowych).źródło
Co powiesz na to?
EDYCJA: zapomniałem o () jednym. EDYCJA 2: Nieprawidłowa pierwsza 3-cyfrowa część.
źródło
.
w klasie znaków, więc[-\.\s]
właściwie powinno być[-.\s]
, ponieważ nie chcemy dopasowywać odwrotnego ukośnika.[\.]
i[.]
oba pasują tylko do kropki, podczas gdy[\\.]
dopasowują zarówno kropkę, jak i lewy ukośnik. Dziękuję za uwagę.Zaczynając od odpowiedzi @ Ravi, zastosowałem również pewne zasady walidacji dla kodu NPA (obszaru) .
W szczególności:
Istnieje kilka innych ograniczeń, w tym zarezerwowane bloki (N9X, 37X, 96X) i 555, ale je pominąłem, szczególnie dlatego, że zarezerwowane bloki mogą być używane w przyszłości, a 555 jest przydatne do testowania.
Oto co wymyśliłem:
Alternatywnie, jeśli chcesz dopasować również puste wartości (jeśli pole nie jest wymagane), możesz użyć:
Moje przypadki testowe dla prawidłowych liczb (wiele z odpowiedzi @Francis) to:
Moje nieprawidłowe przypadki testowe obejmują:
Moje wyrażenie regularne nie obejmuje grupowania w celu wyodrębnienia grup cyfr, ale można je zmodyfikować, aby je uwzględnić.
źródło
Być może najłatwiejszy w porównaniu z kilkoma innymi.
Pasuje do następujących:
źródło
Ten kod będzie pasował do numeru telefonu w Stanach Zjednoczonych lub Kanadzie, a także zapewni, że jest to prawidłowy numer kierunkowy i wymiana:
Przetestuj na Regex101.com
źródło
Wzór Regex do weryfikacji zwykłego 10-cyfrowego numeru telefonu oraz opcjonalnego kodu międzynarodowego (od 1 do 3 cyfr) i opcjonalnego numeru wewnętrznego (dowolna liczba cyfr):
Demo: https://www.regextester.com/103299
Ważne wpisy:
źródło
Uważam, że to wyrażenie regularne jest dla mnie najbardziej przydatne w przypadku 10-cyfrowego numeru kontaktowego:
Źródła : https://regex101.com/r/QeQewP/1
Wyjaśnienie:
źródło
źródło
Jest to bardziej wszechstronna wersja, która będzie pasować tak bardzo, jak tylko mogę wymyślić, a także zapewni dopasowanie grupowe według kraju, regionu, pierwszej i ostatniej.
źródło
a co z wieloma liczbami oznaczonymi „+” i oddzielonymi „;” Znaki „,” „-” lub „”?
źródło
Skończyło się
const regexBase = '(?:\\+?(\\d{1,3}))?[-. (]*(\\d{3})?[-. )]*(\\d{3})[-. ]*(\\d{4,5})(?: *x(\\d+))?'; const phoneRegex = new RegExp('\\s*' + regexBase + '\\s*', 'g');
miało to na przykład pozwolić na takie rzeczy jak holenderskie numery
+358300 20200
źródło
Powyższe wyrażenie regularne to niewielka modyfikacja
@Francis Gagnon.
Cel: aby wykryć wszelkie możliwe wzorce, użytkownik może udostępnić swój numer telefonu w USA
Wersja 1:
Wersja 2:
Co w nim jest: Przypadki testowe mogą być częścią ciągu. W wersji pierwszej przypadki testowe powinny być początkiem linii do pracy.
Jeśli znajdziesz wzór, który może zawieść, napisz komentarz, naprawię to.
Przypadki testowe: zaliczone
źródło
Po prostu wrzucam tam tę odpowiedź, ponieważ rozwiązuje ona mój problem, jest oparta na odpowiedzi @ stormy, ale zawiera 3-cyfrowe kody krajów i, co ważniejsze, może być używany w dowolnym miejscu w ciągu, ale nie pasuje, czy tak nie jest poprzedzona spacją / początkiem ciągu i zakończona granicą słowa. Jest to przydatne, aby nie dopasować losowych liczb w środku adresu URL lub czegoś takiego
źródło