Синтаксис RE2 для несовпадения с нулем

У меня есть следующие значения (строки) в столбце user_id в bigQuery:

g_123_h_34_p_2
g_13_h_14_p_0
g_0_h_14_p_10

Я хочу получить результаты на основе функции REGEXP_CONTAINS в запросе (предложение where). BigQuery обеспечивает поддержку регулярных выражений с помощью библиотеки re2.

Я хочу получить результаты, в которых нет 0 между двумя '_'. Мой желаемый результат: g_123_h_34_p_2

Я не уверен, какое регулярное выражение я должен написать в функции REGEXP_CONTAINS. Я пробовал использовать регулярное выражение, но у меня это не сработало:

REGEXP_CONTAINS (user_dim.user_id, r"^g_[^0][0-9]{1,10}_h_[^0]_p_[^0]$") = TRUE
REGEXP_CONTAINS (user_dim.user_id, r"^g_[1-9]*_h_[^0]*_p_[^0]*$") = TRUE

Ограничения символов регулярных выражений Регулярные выражения со следующими специальными символами не поддерживаются, так как они могут вызывать задержки: * (звездочка) + (знак плюса).


person Anjum    schedule 12.05.2018    source источник


Ответы (1)


попробуйте любой из ниже

REGEXP_CONTAINS(str, r'^0_|_0_|_0$')
REGEXP_CONTAINS(str, r'(^|_)0(_|$)')

Например

#standardSQL
WITH t AS (
  SELECT 'g_123_h_34_p_2' str UNION ALL
  SELECT 'g_13_h_14_p_0' UNION ALL
  SELECT 'g_0_h_14_p_10' 
)
SELECT * 
FROM t
WHERE NOT REGEXP_CONTAINS(str, r'(^|_)0(_|$)')

вернется

Row str  
1   g_123_h_34_p_2   
person Mikhail Berlyant    schedule 12.05.2018
comment
Спасибо, но похоже, что REGEXP_CONTAINS (user_dim.user_id, r^g_[^0][0-9]*_h_[^0][0-9]*_p_[^0][0-9]*$) = TRUE работает для меня. о чем ты думаешь? - person Anjum; 12.05.2018
comment
Зачем использовать более сложное регулярное выражение, если простое работает отлично :o) но это зависит от вас - вы можете иметь в виду что-то еще, что выходит за рамки этого вопроса - поэтому используйте то, что вам подходит лучше всего - person Mikhail Berlyant; 12.05.2018