[ 実現したいこと ]
クエリストリングから、指定の識別子のパラメータセットだけをSQLの正規表現で抽出したい
以下のような、URLのクエリストリングが入っているカラムがあるとします。
例) '?a=123&bcd=345&ef=567&gh=789&abc=123'
ここから、指定した識別子(例えば、abc と bcd)だけを残して後は削除したいとします。
▼欲しい結果
'bcd=345&abc=123'
[ 実現したい環境 ]
・AWS Athena
[ 試したクエリ ]
①否定を使った置換
AthenaSQL
1SELECT regexp_replace('?a=123&bcd=345&ef=567&gh=789&abc=123','((^|?|&)?!(abc|bcd)=.*?(&|$))')
*abc=xxx でも bcd=xxx でもないものを置換して削除する
▼結果
'?a=123&bcd=345&ef=567&gh=789&abc=123' (何も置換されない)
"?!"の部分がどうもうまく聞いていないようです。
(参考)逆に"?!"を抜いて、対象だけを置換してみるとうまく抜けるようです。つまり、否定の部分だけが効いていないと思われます。
▼結果
?a=123ef=567&gh=789
②extract してjoin
AthenaSQL
1select array_join(regexp_extract_all('?a=123&bcd=345&ef=567&gh=789&abc=123','(?|&)((a|abc|bcd|gh)=.*?)(&|$)',2),'&')
▼結果
a=123&gh=789 (&~&が切り取られ、連続したパラメータを指定すると後ろのものが取れない)
後ろの "(&|$)"のものは最短マッチの判定だけに使いたいのですが、"[&$]"などとしても結果は同じです。
こちら、どのような指定方法があるか、わかる方ご教示いただけないでしょうか?
-> その他②で試してみたパターン
- select array_join(regexp_extract_all('?a=123&bcd=345&ef=567&gh=789&abc=123','(?|&)((a|abc|bcd|gh)=.*?)[&|$]',2),'&')
-> ②と同じ結果
- select array_join(regexp_extract_all('?a=123&bcd=345&ef=567&gh=789&abc=123','(?|&)((a|abc|bcd|gh)=.*?)',2),'&')
-> 最短マッチ部分が識別子だけになる (a=&bcd=&gh=&abc=)
- select array_join(regexp_extract_all('?a=123&bcd=345&ef=567&gh=789&abc=123','(?|&)(a=.?|abc=.?|bcd=.?|gh=.?)',2),'&') ※同上
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。