REGEXP_REPLACE 捕获组

标签 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' 

我想要输出:

  '2015-01-01 02:03:04 GMT+0:00'
  -or-
  '2015-01-01 02:03:04 GMT-1:00'

这是一个我“认为”可行的语句的简单示例,但我得到了奇怪的输出。

hive 查询:

select regexp_replace('2015-01-01 02:03:04 +0:00', ' ([+-])', ' GMT\1');

实际结果:

2015-01-01 02:03:04 GMT10:00

请注意,“\1”应该输出匹配的组,而是用数字“1”替换匹配的组。

谁能帮我理解在替换字符串中引用/输出匹配组的正确方法?

谢谢!

最佳答案

对于正则表达式反向引用,Hive 支持的符号(至少对于 0.14,我想我记得对于 0.13.x 也是这样)对于捕获组 1 似乎是 $1 $2 用于捕获组 2 等。看起来它基于(甚至可能由)replaceAll method from the Matcher class 实现.这是该文档的相关部分:

Dollar signs may be treated as references to captured subsequences as described above, and backslashes are used to escape literal characters in the replacement string.

所以我想你想要的是:

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)

关于REGEXP_REPLACE 捕获组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28592180/

相关文章:

regex - Python 3 用字典中的数据替换部分字符串

c# - 用于验证多个值范围的正则表达式 (.NET)

hadoop - 映射器的输出键类型在进入Reducer之前是否可以更改?

unit-testing - 如何让 HBaseTestingUtility 在 map reduce 作业中查找类?

java - 运行配置单元 0.12,出现 slf4j 错误

regex - 正则表达式替换以某个子字符串开头的所有单词的所有出现

c++ - 匹配C语言数字的正则表达式

java -/bin/bash :/bin/java: No such file or directory error in Yarn apps in MacOS

arrays - 将 json 数组导入配置单元

hadoop - 在配置单元中,有没有办法指定在哪些列之间添加新列?