2017-08-10 55 views
1

我在嘗試瞭解和了解更多關於RegExp的電話號碼,尤其是區號。大多數情況下,區域代碼是這樣的: (345)345在此的正則表達式的代碼是:瞭解區號手機的RegExp

^(\()?\d{3}(\))?$ 

,但有什麼辦法,以確保如果(345345)被鍵入,那麼它不返回匹配還是假?

我可以理解爲:

  • ^ ... $ - 在開始和字符串
  • ()結束 - 是第一個捕獲組
  • \( - 第一捕獲組中被發現,尋找「(」在字符串中
  • ? - 我不確定這是什麼,但我認爲它標誌着第一個被捕獲組的結束?
  • \d{3} - 尋找數字(數字),但在3個位數
  • (\))序列 - 第二捕獲組和串

總之在尋找「)」,我要求的?解釋和如果(345345)經過測試,如何返回不匹配。

+0

? - 表示前面的符號不是強制性的 – volkinc

+0

'?'的意思是「零或前一個標記之一」。所以'(\()?'會匹配'「(」'或'「」'(空字符串)。 –

+0

我明白了!非常感謝! –

回答

5

?使正則表達式中的前一個標記可選。 你應該拿出來強制括號,但是因爲你還需要匹配沒有圓括號的區號,你可以使用|來指定一個OR例。

產生的正則表達式看起來像

^((\()\d{3}(\))|\d{3})$

,如果你不需要自己捕捉圓括號,您可以簡化:

^(\(\d{3}\)|\d{3})$

let r = /^(\(\d{3}\)|\d{3})$/ 
 

 
console.log(r.test('555')) // true 
 
console.log(r.test('(555)')) // true 
 
console.log(r.test('(555')) // false 
 
console.log(r.test('555)')) // false

我把整個事情中捕獲組的原因這樣可以在其周圍添加獨立測試,例如,使區號可選,並且期望在可選的-後分隔7位數字第三位。

let r = /^(\(\d{3}\)|\d{3})?\d{3}-?\d{4}$/ 
 

 
console.log(r.test('5555555')) // true 
 
console.log(r.test('555-5555')) // true 
 
console.log(r.test('5555555555')) // true 
 
console.log(r.test('(555)5555555')) // true 
 
console.log(r.test('(555)555-5555')) // true 
 
console.log(r.test('(5555555555')) // false 
 
console.log(r.test('555)5555555')) // false

+0

您是否通過了FreeCodeCamp? –

+0

我沒有看過這個挑戰,所以我不知道它是否滿足要求。這只是使用正則表達式檢測電話號碼的基本方法的一個例子,但是可能有更多的事情可以考慮添加以使其更好(如國家代碼或擴展名)。你也可以通過谷歌一個正則表達式來研究它,因爲在線有很多例子。 –

+0

我看到謝謝!是的,我使用https://regex101.com/來了解正則表達式的每個部分。然而,一些解釋,比如''''似乎更像是行話。 –

1

對於除字符?不用於標記捕獲組末尾的字符,您是正確的。它實際上是一個特殊的量詞字符,表示捕獲組(\()必須匹配零個或多個字符。

解決支架問題的最佳方法是使用OR運營商湯姆建議

例如:

^(\(\d{3}\)|\d{3})$ 

這將尋找一個比賽中都表達這樣你就可以確保有兩個括號或沒有。

+0

問題不在於防止匹配345'!是關於強制要麼2括號或0括號,而不是1括號 –

+0

嗯......'345'只是我輸入的隨機數字。所以我將不得不用'\ d {3}'替換'345',正確嗎? –

+0

@KristinaBressler no我誤解了,如果你用'\ d {3}替換'345',你不會匹配任何3數字組合。最好的辦法是按照湯姆用'OR'運算符的建議:'^(\(\ d {3} \)| \ d {3})$' – Tony

0

不是最優雅的,但只是結合了兩個正則表達式?

^(\(\d{3}\))$|^(\d{3})$ 
0

這裏是一個可能的解決方案

簡單的正則表達式來測試3個位數包裹在()一個,如果刪除了託槽的一個代碼返回false

var str = "(345)" 
var patt = /^\(\d{3}\)$/g; 
var result = patt.test(str); 
console.info(res)