2015-04-23 40 views
1

我設計一個正則表達式匹配以下三種結構中的一種:正則表達式返回空輸出蜂巢

僞代碼:

number.number.number.number e.g. 102.100.1.1 
number.number.number e.g. 1.2.4 
number.number. e.g. 1.2 

正則表達式到目前爲止我是這樣的:

\d{1,3}\\.\d{1,3}\\.\d{1,3}\\.\d{1,3}|\d{1,3}\\.\d{1,3}\\.\d{1,3}|\d{1,3}\\.\d{1,3}} 

我正在運行以下查詢來測試此操作:

select 
    regexp_extract('172.1.1.1', '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|\d{1,3}\.\d{1,3}\.\d{1,3}|\d{1,3}\.\d{1,3}') 
from 
    dual 

Regex101 suggests this should workas does RegExr

但是,結果爲空白。這裏被忽視的是什麼?爲什麼這不起作用?

+2

只得到第二組是非常可能的,你需要雙擊逃生斜線。請參閱https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF。 「請注意,在使用預定義的字符類時需要注意:使用'\ s'作爲第二個參數將匹配字母s;'\\ s'是匹配空格等所必需的。」 –

+0

我試過的第一件事。我已經嘗試了同時轉義所有斜槓(\),並且只轉義斜線點(\)。兩者似乎都不起作用並返回空白 select regexp_extract('172.1.1.1','\\ d {1,3} \\ \\ d {1,3} \\ d {1,3} \\ d {1,3} |。。。\\ d {1,3} \\ d {1,3 } \\ d {1,3} |。。\\ d {1,3} \\ d {1,3} ') 從 雙 選擇 REGEXP_EXTRACT(' 172.1.1.1 ','\ d {1,3} \\。\ d {1,3} \\。\ d {1,3} \\。\ d {1,3} | \ d {1,3} \\ 。\ d {1,3} \\。\ d {1,3} | \\ {1,3} \\。\ d {1,3}') from dual – Tminer

+1

添加索引參數(第3個)設置爲「0」。它會改變結果嗎? –

回答

1

這可能是因爲您使用'\\'。代替 '\。'。使用'\\。',它搜索以下模式:「\」。代替 」。」。

試試這個:

\d{1,3}(\.\d{1,3}){1,3} 

編輯:

你也應該認爲分隔符添加到您的正則表達式。 有了這個正則表達式,如果在「1234.5678」上運行,它將得到「234.567」。 這可以很容易固定,這樣的:

(^|[^\d])(\d{1,3}(\.\d{1,3}){1,3})($|[^\d]) 

然後從輸出

+0

感謝您的建議 - 不幸的是在這種情況下,這是行不通的,'\\'。是必要的。我現在有這個工作得益於上面有關使用索引和雙反斜槓的建議。 – Tminer