【问题标题】:BigQuery - Regex to match number of 8 digits after a known stringBigQuery - 正则表达式匹配已知字符串后的 8 位数
【发布时间】:2020-01-25 09:11:47
【问题描述】:

我需要在已知字符串后提取 8 位数字:

| MyString                     | Extract: | 
| ---------------------------- | -------- | 
| mypasswordis 12345678        | 12345678 | 
| # mypasswordis 12345678      | 12345678 | 
| foobar mypasswordis 12345678 | 12345678 |

我可以使用正则表达式来做到这一点:

(?<=mypasswordis.*)[0-9]{8})

但是,当我想在 BigQuery 中使用 REGEXP_EXTRACT 命令执行此操作时,我收到错误消息“无法解析正则表达式:无效的 perl 运算符:(?

我搜索了re2 library,发现似乎没有与正面后视的等价物。

有没有什么方法可以使用其他方法来做到这一点?像

SELECT REGEXP_EXTRACT(MyString, r"(?<=mypasswordis.*)[0-9]{8}"))

【问题讨论】:

    标签: sql regex google-bigquery regex-lookarounds


    【解决方案1】:

    您需要一个捕获组来提取模式的一部分,请参阅REGEXP_EXTRACT docs you linked to

    如果正则表达式包含捕获组,则该函数返回与该捕获组匹配的子字符串。 如果表达式不包含捕获组,则该函数返回整个匹配的子字符串。

    另外,.* 模式成本太高,你只需要匹配单词和数字之间的空格。

    使用

    SELECT REGEXP_EXTRACT(MyString, r"mypasswordis\s*([0-9]{8})"))
    

    或者只是

    SELECT REGEXP_EXTRACT(MyString, r"mypasswordis\s*([0-9]+)"))
    

    请参阅re2 regex online test

    【讨论】:

    • 根据re2 documentation,也可以用\d代替[0-9]。这使得它改为(\d{8})(\d+)
    【解决方案2】:

    尽量不要使用正则表达式,它很慢。以 substring 和 instr 为例:

    SELECT SUBSTR(MyString, INSTR(MyString,'mypasswordis') + LENGTH('mypasswordis')+1)
    

    否则 Wiktor Stribiżew 可能有正确的答案。

    【讨论】:

    • 正则表达式“慢”但有助于获得精确的值,只有那些必要的和来自指定上下文的值。当输入字符串格式不固定时,正则表达式更好。比如说,mypasswordis 和数字之间的空白字符数不是恒定的,可以是 0、1 或 2 或更多。或者如果数字的数量可以在数字中变化,或者数字后面是否有任何文本等。否则,是的,非正则表达式解决方案通常更直接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 2012-06-05
    • 2013-12-25
    • 1970-01-01
    相关资源
    最近更新 更多