正则表达式字符出现之间的匹配

时间:2018-08-14 13:14:11

标签: sql regex google-bigquery

我有以下字符串:

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

如您所见,字符串由#分隔。我的用例类似于一个简单的SPLIT(string,“#”)操作,但是regex给了我更多的灵活性。

我想匹配两次出现的#之间的字符。例如,第二次和第三次出现之间的字符应匹配:“ 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次出现。

2 个答案:

答案 0 :(得分:1)

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

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

请参见regex demo

详细信息

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

答案 1 :(得分:1)

  

我的用例类似于一个简单的SPLIT(string,“#”)操作,但是regex给了我更多的灵活性

显然REGEXP_EXTRACT()是这里的解决方法-但也想抛出其他选项以显示使用拆分的灵活性-只是选项

#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