我需要提取单个字符串中提到的所有电子邮件帐户,到目前为止,我已尝试使用SUBSTR
和INSTR
,但没有成功,这里有一个示例:
字符串如下所示:
()
string = "User_1" {user_1@domain.com};"User_2" {user_2@domain.com};"User_3" {user_3@domain.com};"User_4" {user_4@domain.com};
select SUBSTR(string ,INSTR(string ,'<',-1,2)) EMAIL
from dual;
我需要的是这样的事情:
user_1@domain.com;user_2@domain.com;user_3@domain.com;user_4@domain.com;
答案 0 :(得分:0)
从this site我发现了这个令人讨厌的正则表达式:
(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
但是,它似乎工作!我不能打破它为你做的事情:P
编辑:这在Oracle中出错,所以我写了一个新的:
([a-zA-Z0-9.\-_])+\@[a-zA-Z]+\.[a-zA-Z.]+
答案 1 :(得分:0)
这样的东西适用于单个输入字符串。它可以适用于多个输入字符串。
with
inputs (str) as (
select '"User_1" {user_1@domain.com};"User_2" {user_2@domain.com};"User_3" {user_3@domain.com};"User_4" {user_4@domain.com};'
from dual
)
select level as ord,
substr(str, instr(str, '{', 1, level) + 1,
instr(str, '}', 1, level) - instr(str, '{', 1, level) - 1) as email
from inputs
connect by level <= length(str) - length(replace(str, '{'))
;
ORD EMAIL
--- -----------------
1 user_1@domain.com
2 user_2@domain.com
3 user_3@domain.com
4 user_4@domain.com
答案 2 :(得分:0)
查找您的字符串中似乎出现的前一个{
和以下};
,您可以使用:
SELECT REGEXP_REPLACE(
'"User_1" {user_1@domain.com};"User_2" {user_2@domain.com};"User_3" {user_3@domain.com};"User_4" {user_4@domain.com};',
'.*?\{(.*?)\};',
'\1;'
) AS emails
FROM DUAL;
<强>输出强>:
EMAILS
------------------------------------------------------------------------
user_1@domain.com;user_2@domain.com;user_3@domain.com;user_4@domain.com;