2016-04-12 19 views
0

Bu sorunu regexone.com - http://regexone.com/problem/matching_phone_numbers adresinde buldum. Numarayla eşleşen ve uygun alan kodunu yakalayan tek bir normal ifade yazın. Bu regex'i anlama konusunda yardıma ihtiyacınız var

Exercise 2: Matching Phone Numbers 

Task  Text   Capture Groups  
Capture 415-555-1234 415  Success 
Capture 650-555-2345 650  Success 
Capture (416)555-3456 416  Success 
Capture 202 555 4567 202  Success 
Capture 4035555678  403  Success 
Capture 1 416 555 9292 416  Success 

Burada ifadesi (\d{1}?(\d{2})) alan kodunu yakalar ama ne anlamamız gerekir benim ilk grup sadece 1 basamak içindir ve isteğe olmasıdır. Ve ikinci grubum sadece 2 basamak tutmalı. 3 rakamı nasıl yakaladı?

+0

Huh? Çünkü 1 + 2 = 3? 2 basamağa ('\ d {2}') veya 3 ('\ d {1} \ d {2}') – h2ooooooo

+0

[* Quantifier: {1}? Tam olarak 1 kez (anlamsız nicelendirici) *] (https://regex101.com/r/xK6sE4/1) –

+0

@ h2ooooooo Son numara 1 416 555 9292 nedir? 1 atlandı ve yakalandı 416 –

cevap

1

@Mateen Ulhaq cevabı tarafından belirtildiği gibi, ilk grup verilen tüm regex olduğunu. Diğer sorunuza gelince, rakam eşleştirmeyi iki gruba ayırmanın herhangi bir nedeni yok gibi görünüyor. Alan kodlarının ara sıra iki basamaklı olması mantıklı olur, ancak verilen örneklerin herhangi birinde geçerli değildir. Regex (\d{3}) hepsi için beklenen çıktıyı verir ve daha kısa ve basittir.

2

İlk grubunuz ilk ( tarafından verilir.

(\d{1}?(\d{2})) 
^   ^
|    | 
|    | 
everything inside here 

Böylece, üç basamağı da yakalar.


Belki regex yazma daha iyi bir yolu olacaktır:

(\d{2,3}) 

tüm iki ya da üç basamaklı sayıları yakalar hangi. siz de (yani 1 800) birinci basamağı yakalamak isterseniz

:

((\d\s)?\d{2,3}) 
+1

Yanıtınız, birinci grubun üç rakamı içerdiğini ve ikinci grubun ilk grubun son 2 rakamını yakaladığını netleştirmelisiniz. "Yakalar" –

İlgili konular