2014-01-28 114 views
7

我一直在試圖弄清楚如何刪除多個非字母數字或非數字字符,或者只返回數字字符一個字符串。我試過了:如何使用Hive刪除非字母數字或非數字字符REGEXP_EXTRACT()函數

SELECT 
regexp_extract('X789', '[0-9]', 0) 
FROM 
table_name 

但它返回'7',而不是'789'。

我也試圖刪除非數字字符使用不符合語法^((?!正則表達式)。)* $:

SELECT 
REGEXP_REPLACE('X789', '^((?![0-9]).)*$', '') 
FROM 
jav_test_ii 

可以REGEXP_EXTRACT返回多個匹配?我真正想要做的是清理我的數據,只包含數字或字母數字字符。這似乎有助於刪除不好的字符,但它不是像[0-9]這樣的字符範圍。 regexp_replace(string,' ','')

編輯:下面的查詢能夠返回'7789',這正是我正在尋找。

SELECT 
regexp_replace("7X789", "[^0-9]+", "") 
FROM 
table_name 

回答

12

參見本hive regexp_extract weirdness

我想regex_extract將只返回在第三個參數表示的組號。

regex_extract似乎只工作在一條線上,然後退出。

我不知道替換對應物。

它可能對非alphanum數據工作,但如果你餵養它像這樣

REGEXP_REPLACE(error_code, '[^a-zA-Z0-9]+', '')


此外,對於提取物,看到上面的鏈接,你可以把它改成

regexp_extract('X789', '[0-9]+', 0)多個號碼。

regexp_extract('XYZ789', '[a-zA-Z]+', 0)多個阿爾法的。

+0

感謝您的提示,這適用於我的例子。如果你有'7X789',它似乎不工作,因爲它只返回'7'。你知道在這種情況下你的解決方案是否可以擴展到返回7789? – user1152532

+0

@ user1152532 - 嘗試替換方法。例如,'regexp_replace(「7(-X78T9)RMM」,「[^ 0-9] +」,「」)'應該返回'7789'。正則表達式包含一個量化的(+)負([^])類,意味着不是0-9之間的數字。它將全局替換所有非數字字符。這是根據文檔。我無法測試它。 – sln

+0

完美的工作......謝謝@sln。看起來我可以在REGEX上使用一個複習 - 你能推薦任何好的網站/資源來加快速度嗎? REGEXP Basics的谷歌搜索結果似乎都指向了像90年代那樣的網站。 – user1152532

相關問題