복붙노트

[HADOOP] REGEXP_REPLACE 그룹 캡처

HADOOP

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'

다음은 내가 생각했던 진술의 간단한 예입니다. 그러나 이상한 결과를 얻습니다.

하이브 쿼리 :

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

실제 결과:

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

"\ 1"은 일치하는 그룹을 출력해야하지만 일치하는 그룹은 숫자 "1"로 바꿉니다.

누군가가 대체 문자열에서 일치하는 그룹을 참조 / 출력하는 올바른 방법을 이해하도록 도와 줄 수 있습니까?

감사!

해결법

  1. ==============================

    1.Hive의 지원 표기법 (적어도 0.14에 대해서, 그리고 내가 생각하기에 정규 표현식 역 참조를위한 0.13.x에 대해서도 이와 같은 방법이 있다고 생각합니다)은 그룹 1을 캡처 할 때 $ 1, 캡처 그룹 2를 $ 2 등으로 보입니다. Matcher 클래스의 replaceAll 메소드를 기반으로 (심지어 구현 될 수도 있음) 이 문서의 밀접한 부분입니다.

    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)
    
  2. from https://stackoverflow.com/questions/28592180/regexp-replace-capturing-groups by cc-by-sa and MIT license