我有以下字符串:
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次出现。
答案 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