oracle正则表达式在标签内部提取字符串

时间:2013-08-02 10:12:02

标签: sql regex oracle

这是我的练习,我的文字如下:

 "lovely heart"<abc.def@hotmail.com>,
 "<<*>>Freeeky<<*>> Jack" <aabbcc@gmail.com>,
 "heavens's kingk*ng '-'asdf" <bbb@yahoo.co.in>
 "sample[^-^]"<sample@ss.com>

我只需要提取:

abc.def@hotmail.com
aabbcc@gmail.com
bbb@yahoo.co.in
sample@ss.com

这是我的尝试,但仍然完成了一半或更少。

WITH t AS
     (SELECT '"lovely heart"<abc.def@hotmail.com>,
"<<*>>Freeeky<<*>> Jack" <aabbcc@gmail.com>, 
"heavens''s kingk*ng ''-''asdf" <bbb@yahoo.com>' word
     FROM dual
     )
SELECT regexp_substr(word, '<(.*@.*)>',1,LEVEL, NULL,1)
FROM t
     CONNECT BY level <= regexp_count(word, '<(.*@.*)>');

一些结果如下:

<*>>Freeeky<<*>> Jack" <aabbcc@gmail.com

请任何好的解决方案。

由于

1 个答案:

答案 0 :(得分:2)

你的正则表达式的问题是,.*之后的第一个<将匹配@之前的所有字符,因为正则表达式中的dot(.)可以匹配除了新队。因此,它甚至会匹配<>。以下是它与您的字符串匹配的方式:

'"< <<*>>Freeeky<<*>> Jack" <aabbcc@gmail.com  >"'
  ^ ^                                       ^  ^
  | -----------------------------------------  |
  |                      |                     |
 Match the first `<`   (.*@.*)           Match the last `>`.

因此,捕获的组是:

<<*>>Freeeky<<*>> Jack" <aabbcc@gmail.com

你得到了什么。您可以将.*更改为[^<>]*以匹配除<>以外的任何字符:

使用以下正则表达式:

'<([^<>]*@[^<>]*)>'