2014-01-28 83 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

相关问题