REGEXP_REPLACE捕获组

时间:2015-02-18 19:26:46

标签: 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”替换匹配的组。

有人可以帮我理解在替换字符串中引用/输出匹配组的正确方法吗?

谢谢!

2 个答案:

答案 0 :(得分:9)

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

  

如上所述,美元符号可被视为对捕获的子序列的引用,反斜杠用于替换替换字符串中的文字字符。

所以我认为你想要的是这个:

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)

答案 1 :(得分:0)

在尝试向后引用REGEXP_REPLACE中捕获的组时,镍'\ 1'或'$ 1'为我工作。 然而,这工作: https://www.logicbig.com/tutorials/core-java-tutorial/java-regular-expressions/group-ref-in-replacement.html

示例:(用连字符替换哈希)

hive> select REGEXP_REPLACE('foo#bar','(?<tag1>foo)#(?<tag2>bar)', '${tag1}-${tag2}');
OK
foo-bar
Time taken: 0.085 seconds, Fetched: 1 row(s)

Hope this is helpful.