2015-05-01 63 views
1

我想寫爲MySQL一個RegExp只會返回以下3種手機格式相匹配的電話號碼格式:問題與正則表達式查詢

+1 000-000-0000 X0000

+1 000-000-0000

000-000-0000 X0000

000-000-0000

所以基本上:

+ [任意位數] [空格] [任意三位數字] - [任意三位數字] - [任意四位數字] [空格] [x] [任意位數]

國家代碼和擴展名是可選的。我對這些都很陌生,但我認爲這應該至少返回一個數字,包括國家代碼和擴展選項,但是當我執行它時,我會得到0個結果。

\x2B[0-9]*\x20[0-9]{3}\-[0-9]{3}\-[0-9]{4}\x20x[0-9]+| 
\x2B[0-9]*\x20[0-9]{3}\-[0-9]{3}\-[0-9]{4}| 
[0-9]{3}\-[0-9]{3}\-[0-9]{4} 

誰能告訴我爲什麼我得到0的結果,即使我有喜歡在我的分貝+1 555-555-5555 x5555記錄。還有什麼語法使國家代碼和擴展名是可選

請注意我正在使用[0-9],因爲我正在查詢文本字段和\ d似乎沒有返回任何東西,即使當我的標準是一些簡單的像\ d *

+0

爲什麼你使用'\ x2B',而不是僅僅逃離'+':'\ +'?有特別的原因嗎?爲什麼你要逃離這些空間(即'\ x20'而不是'') –

+0

基本上,因爲我不知道你可以這樣做:) – user3167249

回答

1

所以,作爲一個共同的努力,原來答案就在這裏:

SELECT * FROM table 
WHERE field 
REGEXP '(^[+][0-9]+\)?([0-9]{3}\-[0-9]{3}\-[0-9]{4})(\ x[0-9]+$)?' 

首先是一個事實,即字符代碼在MySQL(X20,X2B等)是不允許。接下來的重要一步是使用括號和「?」令牌使不同部分可選。

============

我認爲這個問題是缺乏括號來定義子表達式。

這似乎摸出對我來說,雖然它看起來並不真正漂亮:

SELECT '+1 000-000-0000 x0000' REGEXP '^(([+][0-9]*\[ ][0-9]{3}\-[0-9]{3}\-[0-9]{4}[ ]x[0-9]+)|())$' 

一樣

SELECT '' REGEXP '^(([+][0-9]*\[ ][0-9]{3}\-[0-9]{3}\-[0-9]{4}[ ]x[0-9]+)|())$' 

一樣(普通電話號碼):

SELECT '555-555-5555' REGEXP '^(([+][0-9]*\[ ])*[0-9]{3}\-[0-9]{3}\-[0-9]{4}([ ]x[0-9]+)*)|())$' 

編輯:(與上面相同的正則表達式,但測試版本W /國家代碼和擴展名):

SELECT '+1 555-555-5555 x55' REGEXP '^(([+][0-9]*\[ ])*[0-9]{3}\-[0-9]{3}\-[0-9]{4}([ ]x[0-9]+)*)|())$' 

當我嘗試你:

SELECT '+1 000-000-0000 x0000' REGEXP '\x2B[0-9]*\x20[0-9]{3}\-[0-9]{3}\-[0-9]{4}\x20x[0-9]+|' 

我得到:

1139 - Got error 'empty (sub)expression' from regexp 
+0

我發現你不能在mysql中使用chr代碼。我需要逃脫。這是我最終結束了似乎工作:^ \\ + [0-9] + \ |^[0-9] {3} \ - [0-9] {3} \ - [0-9 ] {4} $ | \ x [0-9] + $ – user3167249

+0

如果這是您的問題,請發表詳細解答並接受它。 –

+0

我還沒有想出完整的答案。我需要知道如何使國家代碼和擴展名可選。我現在所擁有的基本上是三者中的任何一個。 – user3167249