2016-09-22 2 views
1

Я не уверен, как сделать regexp_replace, чтобы вернуть цифру в середине строки.Возвращает цифру в середине строки regex

Моя текущая строка: «Игра престолов S2 Ep6», и мне нужно вернуть номер сезона из этого. Мой текущий регулярное выражение делает работу правильно, но имеет два регулярных выражений выражения:

REGEXP_REPLACE(REGEXP_REPLACE('Game of Thrones S1 Ep12', r'(^[^_]*\sS)', ''), r'(\s*Ep\s*\d*\s*$)', '') 

Некоторые другие данные испытаний:

"Smallville S 10 Ep 12"

«Дни нашей жизни S26 Ep324 "

Это первое сообщение с текстом вплоть до первого« S ». Затем отделяет конец строки до и включает пробелы перед «Ep»

Может кто-нибудь, пожалуйста, дайте мне группу захвата, которая позволяет это сделать в одной замене. Это очень дорогостоящий запрос на данный момент.

+0

То, что я не понимаю - почему * заменить * подход на всех? Почему бы просто не зафиксировать номер сезона с помощью регулярного выражения, например: '\ bS \ s * (\ d +) \ s * Ep'? – ClasG

ответ

2

Используйте захват группу вокруг сезона числа (\d+) и заменить обратную ссылку ('\1'):

REGEXP_REPLACE('Game of Thrones S1 Ep12', r'^[^\n_]*\sS\s*(\d+)\s*Ep\s*\d*\s*$', r'\1') 

См this regex demo

Обратите внимание, что я просто простирающуюся свое регулярное выражение, вы можете также проверьте r'^.*\sS\s*(\d+).*' regex, который получит последнее пространство + S с одной или несколькими цифрами после них.

См regex demo

+0

Извините, демо-ссылка получила коррумпированные, исправила ее сейчас. –

1

Вы должны использовать REGEXP_EXTRACT функцию, а не regexp_replace. с помощью стандартного SQL, например, запрос будет выглядеть следующим образом:

select regexp_extract(text, r'[sS][ ]*(\d+)') from (
select text from unnest(["Smallville S 10 Ep 12", "The Days of Our Lives S26 Ep324"]) text) 

и возвращает

Row f0_ 
1 10 
2 26 
Смежные вопросы