【问题标题】:Remove punctuation but not all of them删除标点符号,但不是全部
【发布时间】:2020-01-22 14:20:47
【问题描述】:

我正在努力从可以是相位等的文本变量中删除标点符号。

示例:Hola,我是 llamo Juan! Hoy es día camión。

我使用的代码是:

REGEXP_REPLACE(text, '[^0-9A-Za-z ]+', '')

这通常效果很好。问题是在某些语言中,我们在某些单词上有标点符号。示例:día camión。运行上面的代码时,这些词的输出是“da”“camin”。它会删除与标点符号相关的字母。

有没有办法避免这种情况发生?

谢谢!

【问题讨论】:

    标签: regex hadoop text hive punctuation


    【解决方案1】:

    有两种选择:

    • 使用众多 Unicode 属性之一。例如,\p{L} 匹配来自任何语言的任何 Unicode 字母 - 在这种情况下,您可以使其与 [^0-9p\{L} ]+ 一起使用。有许多不同的 Unicode 属性,以及 Regex 风格之间的差异,所以我建议调查 this link 以供参考。
    • 如果上述解决方案不适合您,请列出您想要匹配的特定 Unicode 代码。例如,í 可以与 \u00ED 匹配,ó 可以与 \u00F3 匹配,因此对于本例, [^\w\u00ED\u00F3 ]+ 可以。那里有许多 Unicode 引用,例如您可以使用的 this one

    除此之外,\w 与 [0-9a-z_A-Z] 的含义相同,\W 返回所有与 \w 不匹配的字符,因此您可以替换表达式的那部分,即 [\W] + 而不是你最初写的。 \W 并不能缓解 Unicode 问题 - 这是一个可读性和简单性的问题。

    【讨论】:

    • 感谢您回答@Bane。你的解释对我来说有点太技术性了,我认为没有得到它对不起......我试图用 [0-9a-z_A-Z] 替换 [0-9a-z_A-Z] 但没有做太多......
      • 输入:惊人的位置 + 员工 = 惊人的位置 + 员工 = 惊人的位置 + 员工 = 惊人 这是一个旅馆,你得到你所支付的!
          [^0-9A-Za-z ]+ 解决方案:令人惊叹的位置工作人员令人惊叹的位置工作人员令人惊叹的位置工作人员令人惊叹它是一家旅馆,您得到您所支付的费用
            [^0-9p\{L}]+ 解决方案: L L L 39 p
    猜你喜欢
    • 2014-06-20
    • 2012-06-25
    • 1970-01-01
    • 2019-08-22
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 2021-12-26
    相关资源
    最近更新 更多