用于 bigquery 的正则表达式在 /api 之后返回所有路径

Posted

技术标签:

【中文标题】用于 bigquery 的正则表达式在 /api 之后返回所有路径【英文标题】:Regex for bigquery to return all paths after /api 【发布时间】:2020-09-21 11:58:12 【问题描述】:

我正在使用 github 的数据集来提取 /api/* 之后的所有路径,为此我使用了下面提到的查询。然而,结果并不如我所愿。如果正则表达式错误,有人可以纠正它吗?

预期结果:

/api/v1/用户

/api/任何东西/任何东西

实际返回的内容:

Frameworks/TwitterKit.framework/Resources doc/source/README.rst
  *
FROM 
   `bigquery-public-data.github_repos.files`
WHERE
(REGEXP_CONTAINS(path,r'(s|^.*/api/([^/]*)(?:/.*)?$|$1|)'))
LIMIT
100```

【问题讨论】:

试试REGEXP_CONTAINS(path, r'^/api/[^/]*(?:/.*)?$') @WiktorStribiżew 感谢您的回答,但现在查询结果为“此查询未返回任何结果。” 嗯,正则表达式是working... 【参考方案1】:

您在正则表达式模式中使用了 Perl substitution 命令。看:

s|^.*/api/([^/]*)(?:/.*)?$|$1 |
||                        |RHS
||___pattern______________|
|___ action

其中RHS(右侧)是替换

您只需要在 BigQuery 中使用一个模式。要匹配您想要的字符串,您可以使用

^/api/[^/]*(?:/.*)?$

请参阅RE2 regex demo。

SELECT * FROM `bigquery-public-data.github_repos.files`
  WHERE REGEXP_CONTAINS(path,r'^/api/[^/]*(?:/.*)?$')
    LIMIT 100

【讨论】:

【参考方案2】:

如果正则表达式有误,有人可以更正吗?

#standardSQL
SELECT *
FROM `bigquery-public-data.github_repos.files`
WHERE REGEXP_CONTAINS(path, r'/api/.*')
LIMIT 100   

同时,请注意:您的问题标题与问题正文不一致 - WHERE 子句中的REGEXP_CONTAINS 仅允许您返回路径中具有搜索模式的所有行 - 但不提取模式.

要提取模式 - 您需要在 SELECT 语句中使用REGEXP_EXTRACT(path, r'/api/.*')

【讨论】:

以上是关于用于 bigquery 的正则表达式在 /api 之后返回所有路径的主要内容,如果未能解决你的问题,请参考以下文章

如何在bigquery中获取字符串中正则表达式的匹配数?

BigQuery 中的正则表达式

bigquery 中的正则表达式

Bigquery 正则表达式在多个空格后提取数字

有效 WKT 线串的正则表达式(在 BigQuery 中)?

Bigquery 中数字+字母组合的正则表达式