【问题标题】:sql regexp string end with ".0"sql 正则表达式字符串以“.0”结尾
【发布时间】:2019-11-27 13:22:41
【问题描述】:

我想判断一个正数字符串是否以“.0”结尾,所以我写了如下sql: select '12310' REGEXP '^[0-9]*\.0$'。结果是true。我想知道为什么我得到了结果,因为我在“。”之前使用了“\”。逃离。 所以我又写了一个select '1231.0' REGEXP '^[0-9]\d*\.0$',但是这次结果是false。 谁能告诉我正确的模式?

【问题讨论】:

  • 使用'^[0-9]*\\.0$''^[0-9]+\\.0$'
  • 尝试使用REGEXP '^[0-9]*[.]0$',如果可行,那么 Wiktor 的评论是在金钱上,而您没有正确地转义点。
  • Hive SQL 与常规 SQL 有什么不同吗?我几乎可以肯定select '1231.0' REGEXP '^[0-9]\d*\.0$' 会产生错误。

标签: sql regex hive hiveql numeric


【解决方案1】:

正则表达式中的点 (.) 具有特殊含义(任何字符),如果您想要字面上的点,则需要转义:

 select '12310' REGEXP '^[0-9]*\\.0$';

结果:

false

使用双斜杠转义 Hive 中的特殊字符。斜杠具有特殊含义,用于\073(分号)、\n(换行符)、\t(制表符)等字符。这就是为什么要转义需要使用双斜杠。同样对于字符类数字使用\\d:

hive> select '12310.0' REGEXP '^\\d*?\\.0$';
OK
true

方括号内的字符也不需要双斜线转义:可以使用[.] 代替\\.

【讨论】:

    【解决方案2】:

    如果你知道它是一个数字字符串,为什么不直接使用:

    select ( val like '%.0' )
    

    如果你想验证字符串在其他地方是否有数字,你需要正则表达式。但如果只需要检查最后两个字符,like 就足够了。

    至于您的问题. 是正则表达式中的通配符。它匹配任何字符。

    【讨论】:

    • 是的,你是对的。最后我用户like,但我想知道为什么我不能写正确的正则表达式。
    猜你喜欢
    • 2019-07-20
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 2021-01-17
    • 2016-03-26
    • 2015-08-01
    • 2013-10-27
    • 1970-01-01
    相关资源
    最近更新 更多