16

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」に置き換えます。

誰かが置換文字列で一致したグループを参照/出力する正しい方法を理解するのを手伝ってくれますか?

ありがとう!

4

2 に答える 2

19

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)
于 2015-02-18T21:22:34.920 に答える