Oracle - 从字符串中提取多个子字符串

时间:2017-03-29 22:49:21

标签: sql regex oracle

我需要提取单个字符串中提到的所有电子邮件帐户,到目前为止,我已尝试使用SUBSTRINSTR,但没有成功,这里有一个示例:

字符串如下所示:

()
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;

3 个答案:

答案 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

Here's an example on regexr

编辑:这在Oracle中出错,所以我写了一个新的:

([a-zA-Z0-9.\-_])+\@[a-zA-Z]+\.[a-zA-Z.]+

Here's an example of the new one in regexr

答案 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;