REGEXP_REPLACE 捕获组

问题描述 投票:0回答:3

我想知道是否有人可以帮助我了解如何使用 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”替换匹配的组。

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

谢谢!

regex hadoop hive regexp-replace
3个回答
22
投票

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');

例如:

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
投票
在尝试反向引用 REGEXP_REPLACE 中捕获的组时,“ ”和“$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.
    

0
投票
带有捕获组的正则表达式正在我的 AWS Athena SQL 查询中运行(感谢@rchang):

SELECT regexp_replace('toto-prod-titi-prod-tata', '-prod-(.*?)-prod-', '-uat-$1-uatr-')
给了我预期的结果:

toto-uat-titi-uatr-tata

© www.soinside.com 2019 - 2024. All rights reserved.