在字符串正则表达式的中间返回一个数字

时间:2016-09-22 10:33:50

标签: regex google-bigquery

我不确定如何使用regexp_replace返回字符串中间的数字。

我目前的字符串是:"权力的游戏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&#34 ;. 然后在#34; Ep"

之前将字符串的末尾分开并包括空格。

有人可以给我一个捕获组,允许在一次替换中完成。目前这是一个非常昂贵的查询。

2 个答案:

答案 0 :(得分:3)

在季节编号(\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+).*'正则表达式,它将获得最后一个空格+ S,后面有一个或多个数字。

请参阅regex demo

答案 1 :(得分: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