【问题标题】:How To Remove non-alpha numeric, or non-numeric characters with Hive REGEXP_EXTRACT() Function如何使用 Hive REGEXP_EXTRACT() 函数删除非字母数字或非数字字符
【发布时间】:2014-02-20 05:10:33
【问题描述】:

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

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

【问题讨论】:

    标签: regex hadoop hive etl


    【解决方案1】:

    另见hive regexp_extract weirdness

    我认为 regex_extract 只会返回第三个参数中所述的组号。

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

    我不知道替换对应项。

    它可能适用于非字母数字数据,但如果你给它提供这样的东西

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


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

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

    regexp_extract('XYZ789', '[a-zA-Z]+', 0) 用于多个 alpha。

    【讨论】:

    • 感谢您的提示,它适用于我的示例。如果您有“7X789”,它似乎不起作用,因为它只返回“7”。您知道在这种情况下您的解决方案是否可以扩展为返回 7789?
    • @user1152532 - 尝试替换方法。例如,regexp_replace("7(-X78T9)RMM", "[^0-9]+", "") 应该返回 7789。正则表达式包含一个量化的 (+) 负 ([^]) 类,表示不是 0-9 之间的数字。它将全局替换所有非数字字符。这是根据文档。我无法测试它。
    • 效果很好...谢谢@sln。看起来我可以在 REGEX 上使用复习 - 你能推荐任何好的网站/资源来加快速度吗? REGEXP Basics 的谷歌搜索结果似乎都指向看起来像 90 年代的网站。
    • 太好了,成功了!我会先尝试维基百科。搜索“正则表达式”,阅读一些关于细微差别和风味的基础知识。祝你好运!
    猜你喜欢
    • 2013-11-29
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    相关资源
    最近更新 更多