REGEXP_EXTRACT в Импале - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь выяснить, как извлечь идентификатор клиента из строки, которая выглядит так:

{"param":"success","value":"10","level":"0","error_code":"101","customer_id":"5b0e9b23e423b0d33c9f7ddfd", "purchases": "13", "last_activity_ts": "123523465"}

Я пытаюсь извлечь идентификатор клиента из строк, содержащих код ошибки 101 со следующим кодом:

select regexp_extract(field, '\"customer_id":"(.*)', 0) from table_name
where field rlike '"error_code":"101"'

Но это дает мне следующий результат:

"customer_id":"5b0e9b23e423b0d33c9f7ddfd", "purchases": "13", "last_activity_ts": "123523465"}

Ожидаемый результат:

5b0e9b23e423b0d33c9f7ddfd

Не могли бы вы помочь мне с этим?

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Ваше регулярное выражение совпадает с "customer_id":" до конца строки, потому что вы используете .*, который будет соответствовать любому символу ноль или более раз, и вы используете 0 в качестве последнего параметра regexp_extract., который относится ко всему извлеченная строка.

Чтобы соответствовать тому, что находится между двойными кавычками, вы можете не сопоставлять двойные кавычки и захватывать их в группе ([^"]+), используя отрицательный класс символов :

"customer_id":"([^"]+)"

Или вы можете указать диапазоны символов в классе символов, повторить его один или несколько раз ([a-f0-9]+) и зафиксировать его в группе:

"customer_id":"([a-f0-9]+)"

Ваше значение находится в первой группе захвата, которую, я думаю, вы могли бы указать, используя 1 в качестве третьего параметра для regexp_extract .

regexp_extract(field, '"customer_id":"([a-f0-9]+)"', 1)
0 голосов
/ 29 июня 2018

Вы можете использовать ниже регулярное выражение:

"customer_id":"([\w\d]+)"

Демо: https://regex101.com/r/MEOGw8/1

Тест:

{"param":"success","value":"10","level":"0","error_code":"101","customer_id":"5b0e9b23e423b0d33c9f7ddfd", "purchases": "13", "last_activity_ts": "123523465"}

Match:

Match 1
Full match  63-104  `"customer_id":"5b0e9b23e423b0d33c9f7ddfd"`
Group 1.    78-103  `5b0e9b23e423b0d33c9f7ddfd`

Оператор SQL:

select regexp_extract(field, '"customer_id":"([\w\d]+)"',1, 1) from table_name
where field rlike '"error_code":"101"'
...