我想知道是否有人可以帮助我了解如何使用 Hive 的 regexp_replace 函数来捕获正则表达式中的组并在替换字符串中使用这些组。
我正在解决一个涉及日期修改的示例问题。在此示例中,我的目标是获取与 SimpleDateFormat 解析不兼容的字符串日期,并进行一些小的调整以使其兼容。日期字符串(如下所示)需要在字符串中的偏移符号 (+/-) 前面添加“GMT”。
因此,给定输入:
'2015-01-01 02:03:04 +0:00'
-or-
'2015-01-01 02:03:04 -1:00'
我想要输出:
'2015-01-01 02:03:04 GMT+0:00'
-or-
'2015-01-01 02:03:04 GMT-1:00'
这是一个我“认为”可行的语句的简单示例,但我得到了奇怪的输出。
蜂巢查询:
select regexp_replace('2015-01-01 02:03:04 +0:00', ' ([+-])', ' GMT\1');
实际结果:
2015-01-01 02:03:04 GMT10:00
请注意,“\1”应该输出匹配的组,而是用数字“1”替换匹配的组。
有人可以帮助我理解在替换字符串中引用/输出匹配组的正确方法吗?
Thanks!
Hive 支持的正则表达式反向引用符号(至少在 0.14 中是这样,我想我记得在 0.13.x 中也是这样)似乎是$1
对于捕获组 1,$2
对于捕获组 2 等。看起来它基于(甚至可能由其实现)Matcher 类中的 ReplaceAll 方法 http://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#replaceAll%28java.lang.String%29。这是该文档的相关部分:
如上所述,美元符号可以被视为对捕获的子序列的引用,并且反斜杠用于转义替换字符串中的文字字符。
所以我认为你想要的是这样的:
select regexp_replace('2015-01-01 02:03:04 +0:00', ' ([+-])', ' GMT$1');
例如:
hive> select regexp_replace('2015-01-01 02:03:04 +0:00', ' ([+-])', ' GMT$1');
OK
2015-01-01 02:03:04 GMT+0:00
Time taken: 0.072 seconds, Fetched: 1 row(s)
hive> select regexp_replace('2015-01-01 02:03:04 -1:00', ' ([+-])', ' GMT$1');
OK
2015-01-01 02:03:04 GMT-1:00
Time taken: 0.144 seconds, Fetched: 1 row(s)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)