Извлечь символ между первыми двумя символами

#sql #regex #google-bigquery

# #sql #регулярное выражение #google-bigquery

Вопрос:

У меня есть таблица в BigQuery:

 ab_col_jfsfhfd_ggg_sdf
arfd_am_fdsf_fddg_fg
d_fdf_fdddg_ffddd_f
 

Я хотел бы извлечь те символы, которые идут сразу после первого символа _ и за которыми следует второй символ _ . Я хочу получить следующее:

 col
am
fdf
 

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

 ^.*_(D )_.*$
regexp_replace(id,'^.*\_(\D )\_.*

Пожалуйста, помогите!


Ответ №1:

Если я правильно вас понял, вы можете использовать split() :

 (split(col, '_'))[safe_ordinal(2)]
 

split() превращает столбец string в массив значений с заданным разделителем (здесь мы используем _ ). Тогда мы можем просто захватить второй элемент массива.

Комментарии:

1. Я получаю эту ошибку: индекс массива 2 выходит за пределы (переполнение)

2. @Alex: тогда, похоже, некоторые из ваших строк не содержат символов _ . Вы можете использовать safe_ordinal() , чтобы избежать этой ошибки (и вернуть null в таком случае).

Ответ №2:

split() это очень простой способ решения этой проблемы. Но регулярные выражения также довольно просты:

 with t as (
      select 'ab_col_jfsfhfd_ggg_sdf' as id union all
      select 'arfd_am_fdsf_fddg_fg' union all
      select 'd_fdf_fdddg_ffddd_f'
     )
select id, regexp_extract(id, '[^_] ', 1, 2)
from t;
 

Логика шаблона такова: "Ищите любую строку символов, которая не является символом подчеркивания. Затем возьмите второй символ в строке. "

Ответ №3:

Использовать regexp_extract :

 regexp_extract(id,'^[^_] _([^_] )')
 

Смотрите доказательство

Объяснение

 --------------------------------------------------------------------------------
  ^                        the beginning of the string
--------------------------------------------------------------------------------
  [^_]                     any character except: '_' (1 or more times
                           (matching the most amount possible))
--------------------------------------------------------------------------------
  _                        '_'
--------------------------------------------------------------------------------
  (                        group and capture to 1:
--------------------------------------------------------------------------------
    [^_]                     any character except: '_' (1 or more
                             times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  )                        end of 1
 

, '\1')
Пожалуйста, помогите!

Ответ №1:

Если я правильно вас понял, вы можете использовать split() :


split() превращает столбец string в массив значений с заданным разделителем (здесь мы используем _ ). Тогда мы можем просто захватить второй элемент массива.

Комментарии:

1. Я получаю эту ошибку: индекс массива 2 выходит за пределы (переполнение)

2. @Alex: тогда, похоже, некоторые из ваших строк не содержат символов _ . Вы можете использовать safe_ordinal() , чтобы избежать этой ошибки (и вернуть null в таком случае).

Ответ №2:

split() это очень простой способ решения этой проблемы. Но регулярные выражения также довольно просты:


Логика шаблона такова: «Ищите любую строку символов, которая не является символом подчеркивания. Затем возьмите второй символ в строке. »

Ответ №3:

Использовать regexp_extract :


Смотрите доказательство

Объяснение