2016-04-12 26 views
0

私はregexone.com - http://regexone.com/problem/matching_phone_numbersでこの問題を発見しました。番号と一致する単一の正規表現を記述し、適切な市外局番を取得します。ここでこの正規表現を理解する助けが必要

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 

表現(\d{1}?(\d{2}))は、市外局番をキャプチャーしますが、私は理解する必要があることは私の最初のグループは唯一の1桁のためのものであり、オプションです。そして、私の2番目のグループは2桁しか保持しません。どのように3桁の数字をキャプチャしましたか?

+0

Huh? 1 + 2 = 3であるから? 2桁( '\ d {2}')または3( '\ d {1} \ d {2}')に一致します。 – h2ooooooo

+0

[* Quantifier:{1}?正確に1回(意味のない量詞)*](https://regex101.com/r/xK6sE4/1) –

+0

@ h2ooooooo最後の数字はどうですか416 555 9292? 1をスキップしてキャプチャした416 –

答えて

1

@Mateen Ulhaqの答えで述べたように、最初のグループは、与えられた正規表現全体です。あなたのもう一つの質問については、数字のマッチングを2つのグループに分割する理由がないようです。市外局番が2桁の場合がありますが、この例では該当しません。正規表現(\d{3})は、すべての出力に期待される出力を与え、より短く簡単です。

2

あなたの最初のグループは、最初の(です。

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

したがって、3桁の数字がすべてキャプチャされます。


おそらく、あなたの正規表現を書くことのより良い方法は、次のようになります。すべての二、三桁の数字をキャプチャ

(\d{2,3}) 

あなたが同様に最初の数字(すなわち、1 800)を取得したい場合:

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

答えでは、最初のグループには3桁の数字がすべて含まれ、2番目のグループには最初のグループの最後の2桁がキャプチャされることを明確にしてください。 "キャプチャ" –

関連する問題