jat*_*tal 11 regex hadoop hive regexp-replace
我想知道是否有人可以帮助我理解如何使用Hive的regexp_replace函数来捕获正则表达式中的组并在替换字符串中使用这些组.
我有一个示例问题,我正在通过下面的工作,涉及日期修改.在这个例子中,我的目标是获取与SimpleDateFormat解析不兼容的字符串日期,并进行一些小调整以使其兼容.日期字符串(如下所示)需要在字符串中的偏移符号(+/-)前面添加"GMT".
所以,给定输入:
'2015-01-01 02:03:04 +0:00'
-or-
'2015-01-01 02:03:04 -1:00'
Run Code Online (Sandbox Code Playgroud)
我想要输出:
'2015-01-01 02:03:04 GMT+0:00'
-or-
'2015-01-01 02:03:04 GMT-1:00'
Run Code Online (Sandbox Code Playgroud)
这是一个我认为会起作用的声明的简单例子,但我得到了奇怪的输出.
Hive查询:
select regexp_replace('2015-01-01 02:03:04 +0:00', ' ([+-])', ' GMT\1');
Run Code Online (Sandbox Code Playgroud)
实际结果:
2015-01-01 02:03:04 GMT10:00
Run Code Online (Sandbox Code Playgroud)
请注意,"\ 1"应输出匹配的组,而是使用数字"1"替换匹配的组.
有人可以帮我理解在替换字符串中引用/输出匹配组的正确方法吗?
谢谢!
rch*_*ang 11
Hive的支持符号(至少0.14,我想我也记得0.13.x也是如此)正则表达式反向引用似乎是$1
针对捕获组1,$2
捕获组2等等.它看起来像是基于它(甚至可以通过Matcher类的replaceAll方法实现).这是该文档的密切关系部分:
如上所述,美元符号可被视为对捕获的子序列的引用,反斜杠用于替换替换字符串中的文字字符.
所以我觉得你想要的是这个:
select regexp_replace('2015-01-01 02:03:04 +0:00', ' ([+-])', ' GMT$1');
Run Code Online (Sandbox Code Playgroud)
例如:
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)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6779 次 |
最近记录: |