正则表达式 字符匹配



>我有以下字符串:

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

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

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

我正在使用 Google Bigquery,并且能够匹配字符串的前两个术语,但在第三个术语上遇到困难:

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

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

我发现了这个问题,但我有多个分量表,并想指定应该在哪些情况下进行匹配,例如第 2 次和第 5 次出现。

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

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

查看正则表达式演示

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

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

显然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    

最新更新