BigQuery - 正则表达式在已知字符串之后匹配模式(积极的后向替代)

ang*_*bot 2 regex sql re2 google-bigquery regex-lookarounds

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

| MyString                     | Extract: | 
| ---------------------------- | -------- | 
| mypasswordis 12345678        | 12345678 | 
| # mypasswordis 12345678      | 12345678 | 
| foobar mypasswordis 12345678 | 12345678 |
Run Code Online (Sandbox Code Playgroud)

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

(?<=mypasswordis.*)[0-9]{8})
Run Code Online (Sandbox Code Playgroud)

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

我搜索了re2 库,发现似乎没有与积极向后查找等效的东西。

有什么办法可以使用其他方法来做到这一点吗?就像是

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

Wik*_*żew 5

您需要一个捕获组来提取模式的一部分,请参阅REGEXP_EXTRACT您链接到的文档

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

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

一般来说,要“转换”(?<=mypasswordis).*具有正向后看的模式,您可以使用mypasswordis(.*).

在这种情况下,您可以使用

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

要不就

SELECT REGEXP_EXTRACT(MyString, r"mypasswordis\s*([0-9]+)"))
Run Code Online (Sandbox Code Playgroud)

请参阅re2 正则表达式在线测试