【问题标题】:Regex match everything after first and until 2nd occurrence of a slash正则表达式匹配第一次出现斜线之后的所有内容,直到第二次出现斜线
【发布时间】:2019-09-13 14:23:31
【问题描述】:

需要匹配第一个 / 之后的所有内容,直到第二个 / 或字符串结尾。举个例子:

/US
/CA
/DE/Special1
/FR/Special 1/special2

需要以下返回:

US
CA
DE
FR

在 DataStudio 中使用它有效:

^(.+?)/

但是 BigQuery 中的相同只是返回 null。在这里尝试了几十个其他示例后,决定问自己。感谢您的帮助。

【问题讨论】:

  • 试试/([^/]+)
  • 感谢 BigQuery 中的工作。知道为什么这适用于 BigQuery,但不适用于 regex101.com 等在线工具吗?
  • BQ 使用特定的库来解析正则表达式 (github.com/google/re2/wiki/Syntax)。其他网站和语言可能使用不同的库/实现。

标签: regex google-bigquery


【解决方案1】:

对于这种简单的提取 - 考虑使用更便宜的字符串函数而不是更昂贵的正则表达式函数。请看下面的示例

#standardSQL
WITH `project.dataset.table` AS (
  SELECT '/US' line UNION ALL
  SELECT '/CA' UNION ALL
  SELECT '/DE/Special1' UNION ALL
  SELECT '/FR/Special 1/special2' 
)
SELECT line, SPLIT(line, '/')[SAFE_OFFSET(1)] value 
FROM `project.dataset.table`   

结果

Row line                    value    
1   /US                     US   
2   /CA                     CA   
3   /DE/Special1            DE   
4   /FR/Special 1/special2  FR   

【讨论】:

  • 嗯,我正在寻找一个字符串函数来执行此操作,就像我通常在 python 中所做的那样,但无法让它们工作。不过这看起来不错,谢谢!我试试看。
  • 赞成。再次感谢,我一直在寻找一种字符串拆分方法,但没有找到,所以很高兴看到它存在。比正则表达式好得多。
【解决方案2】:

您的正则表达式在字符串的开头(直到第一个斜杠)尽可能少地匹配任何 1 个或多个字符,并将此值放入第 1 组。然后它使用 / 字符。它实际上并不符合您的需要。

您可以在 BigQuery 中使用与字符串部分匹配的正则表达式,然后捕获您需要获取的部分:

/([^/]+)

它将匹配第一次出现的斜线,后跟一个或多个字符,而不是斜线,将捕获的子字符串放在您获得的结果中。

【讨论】:

    猜你喜欢
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 2019-07-19
    • 2016-03-18
    • 2022-08-13
    • 1970-01-01
    相关资源
    最近更新 更多