如何使用Hive REGEXP_EXTRACT()函数删除非字母数字或非数字字符

时间:2014-01-28 18:10:17

标签: regex hadoop hive etl

我一直试图弄清楚如何删除多个非字母数字或非数字字符,或只返回字符串中的数字字符。我试过了:

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

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

我还尝试使用NOT MATCH语法^((?!regexp)删除非数字字符。)* $:

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

1 个答案:

答案 0 :(得分:19)

另见hive regexp_extract weirdness

我认为regex_extract只会返回第3个参数中指定的组号。

regex_extract似乎只能在一条线上工作然后退出。

我不知道替换对手。

它可能适用于非孤儿数据,但如果你喂它像这样

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


此外,对于提取,请参阅上面的链接,您可以将其更改为

regexp_extract('X789', '[0-9]+', 0)表示多个号码。

多个alpha的

regexp_extract('XYZ789', '[a-zA-Z]+', 0)