【问题标题】:Regular Expression Match between occurrence of character字符出现之间的正则表达式匹配
【发布时间】:2018-08-14 13:14:11
【问题描述】:

我有以下字符串:

3#White House, District Of Columbia, United States#US#USDC#DC001#38.8951#-77.0364#531871#382

如您所见,字符串由# 分隔。我的用例类似于一个简单的 SPLIT(string,"#") 操作,但正则表达式给了我更多的灵活性。

我想匹配两次出现的# 之间的字符。例如,第二次和第三次出现之间的字符应该匹配:'US'

我正在使用 Google Bigquery,并且能够匹配字符串的前两个术语,但与第三个术语相匹配:

REGEXP_EXTRACT(locations,r'^\d') as location_type,    
REGEXP_REPLACE(REGEXP_EXTRACT(locations,r'^\d#.*?#'),r'^\d*#|#','') as location_full_name, 
????

位置是字符串,例如上面的字符串。

我找到了这个question,但我有多个分隔符,并且想指定匹配应该发生在哪些事件之间,例如第 2 次和第 5 次出现。

【问题讨论】:

    标签: sql regex google-bigquery


    【解决方案1】:

    您可以使用像^(?:[^#]*#){N}([^#]*) 这样的正则表达式,其中N 是您所需的子字符串数减1。要获得第三个值US,您可以使用

    ^(?:[^#]*#){2}([^#]*)
    

    regex demo

    详情

    • ^ - 字符串开头
    • (?:[^#]*#){2} - 两个序列
      • [^#]* - 除# 之外的任何零个或多个字符
      • # - 一个 # 字符
    • ([^#]*) - 捕获组 1:除 # 之外的任何零个或多个字符。

    【讨论】:

    • 哇,这太强大了。您将如何使用此正则表达式在第 2 次和第 5 次出现之间进行匹配?其余的可能我自己就能弄清楚。
    • @RutgerHofste 如果你想匹配它们,^(?:[^#]*#)([^#]*(?:#[^#]*){3})
    • 预期结果将是“US#USDC#DC001#38.8951”(包括第 2 次和第 5 次分隔符之间的分隔符在内的所有字符)
    • @RutgerHofste 然后在非捕获组之后使用{2}限制量词,^(?:[^#]*#){2}([^#]*(?:#[^#]*){3})
    【解决方案2】:

    我的用例类似于一个简单的 SPLIT(string,"#") 操作,但正则表达式给了我更多的灵活性

    显然REGEXP_EXTRACT() 是去这里的方式 - 但想抛出不同的选项以显示使用 split 的灵活性 - 只是一个选项

    #standardSQL
    WITH `project.dataset.table` AS (
      SELECT '3#White House, District Of Columbia, United States#US#USDC#DC001#38.8951#-77.0364#531871#382' locations
    )
    SELECT 
      REGEXP_EXTRACT(locations, r'^(?:[^#]*#){2}([^#]*(?:#[^#]*){3})') value_via_regexp,
      (SELECT STRING_AGG(part, '#' ORDER BY pos) FROM UNNEST(SPLIT(locations, '#')) part WITH OFFSET pos WHERE pos BETWEEN 2 AND 5) value_via_split_unnest
    FROM `project.dataset.table`      
    

    结果为

    Row     value_via_regexp            value_via_split_unnest   
    1       US#USDC#DC001#38.8951       US#USDC#DC001#38.8951    
    

    【讨论】:

    • 您好,我遇到了类似的难题。我正在使用 BQ 查询,我的数据集在其中 1 列中包含信息,例如记录 1:“A.B.C.D”记录 2:“P.Q.R”记录 3:“X.Y”记录 4:“L.M.N”,我必须获取除单独列中的点。请注意,1 列内有不同数量的点。在一次查询中努力做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 2010-11-19
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多