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)
您需要一个捕获组来提取模式的一部分,请参阅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 正则表达式在线测试。