具有以下字串(這是一個 salesforce 查詢,但不重要):
IF(OR(CONTAINS(EmailDomain,"yahoo"),CONTAINS(EmailDomain,"gmail"),
CONTAINS("protonmail.com,att.net,chpmail.com,smail.com",EmailDomain)),
"Free Mail","Business Email")
我想得到一個包含在雙引號之間的所有子字串的陣列,如下所示:
['yahoo',
'gmail',
'protonmail.com,att.net,chpmail.com,smail.com',
'Free Mail',
'Business Email']
在python中我這樣做:
re.findall(r'"(. ?)"', <my string>)
但是有沒有辦法在雪花中復制它?
我試過了
SELECT
REGEXP_SUBSTR('IF(OR(CONTAINS(EmailDomain,"yahoo"),CONTAINS(EmailDomain,"gmail"),
CONTAINS("protonmail.com,att.net,chpmail.com,smail.com",EmailDomain)),
"Free Mail","Business Email")', '"(. ?)"') as emails;
但我明白了:
"yahoo"),CONTAINS(EmailDomain,"gmail"
uj5u.com熱心網友回復:
您可以使用
select split(trim(regexp_replace(regexp_replace(col, '"([^"] )"|.', '\\1|'),'\\| ','|'), '|'), '|');
詳情:
regexp_replace(col, '"([^"] )"|.', '\\1|')- 查找最近的雙引號之間的任何字串,同時將引號內的部分捕獲到第 1 組中,或匹配任何單個字符并將每個匹配替換為第 1 組內容|字符(請參閱正則運算式演示)regexp_replace(...,'\\| ','|')- 這會將所有連續的管道符號縮小為一個|字符的單個出現(請參閱此正則運算式演示)trim(..., '|')- 洗掉|字串兩端的字符split(..., '|')- 用|字符分割字串。
uj5u.com熱心網友回復:
Wiktor 的回答效果很好。我正在為需要執行此操作的任何人添加替代答案,并且他們參考的字串可能包含管道|字符。對包含管道的字串使用替換方法會將字串拆分為多個陣列成員。這是一種方法(不是唯一的方法),它可以在參考的字串可能包含管道字符的情況下起作用:
set col = $$IF(OR(CONTAINS(EmailDomain,"yahoo"),CONTAINS(EmailDomain,"gmail"),CONTAINS("protonmail.com,att.net,chpmail.com,smail.com",EmailDomain)),"Free Mail","Business Email | Other")$$;
create or replace function GET_QUOTED_STRINGS("s" string)
returns array
language javascript
strict immutable
as
$$
var re = /(["'])(?:\\.|[^\\])*?\1/g;
var m;
var out = [];
do {
m = re.exec(s);
if (m) {
out.push(m[0].replace(/['"] /g, ''));
}
} while (m);
return out;
$$;
select get_quoted_strings($col);
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/424996.html
