>我有以下字符串:
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