【问题标题】:Return a digit in the middle of a string regex返回字符串正则表达式中间的一个数字
【发布时间】:2017-01-30 21:26:28
【问题描述】:

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

我当前的字符串是:“权力的游戏 S2 Ep6”,我需要从中返回季节编号。我当前的正则表达式正确地完成了这项工作,但需要两个正则表达式:

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

其他一些测试条目是:

“超人前传 S 10 第 12 集”

“我们的日子 S26 Ep324”

This first 剥离文本,直至并包括第一个“S”。 然后拆分字符串的结尾,直到并包括 "Ep" 之前的空格

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

【问题讨论】:

  • 我不明白的是 - 为什么要使用 replace 方法?为什么不直接使用正则表达式捕获季节编号,例如 - \bS\s*(\d+)\s*Ep

标签: regex google-bigquery


【解决方案1】:

在季号 (\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

【讨论】:

  • 抱歉,演示链接损坏,现在修复。
【解决方案2】:

您需要使用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   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    相关资源
    最近更新 更多