regexp\u替换捕获组

3npbholx  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(579)

我想知道是否有人能帮助我理解如何使用hive的regexp\u replace函数来捕获regex中的组并在替换字符串中使用这些组。
我有一个例子的问题,我正在通过下面的工作,涉及日期咀嚼。在本例中,我的目标是获取一个与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”。
有人能帮助我理解在替换字符串中引用/输出匹配组的正确方法吗?
谢谢!

9rbhqvlz

9rbhqvlz1#

hive支持的regex backreferences的表示法(至少对于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)
x3naxklr

x3naxklr2#

尝试在regexp\u replace中反向引用捕获的组时,nither“\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.

相关问题