这是我的练习,我的文字如下:
"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
请任何好的解决方案。
由于
答案 0 :(得分:2)
你的正则表达式的问题是,.*
之后的第一个<
将匹配@
之前的所有字符,因为正则表达式中的dot(.)
可以匹配除了新队。因此,它甚至会匹配<
和>
。以下是它与您的字符串匹配的方式:
'"< <<*>>Freeeky<<*>> Jack" <aabbcc@gmail.com >"'
^ ^ ^ ^
| ----------------------------------------- |
| | |
Match the first `<` (.*@.*) Match the last `>`.
因此,捕获的组是:
<<*>>Freeeky<<*>> Jack" <aabbcc@gmail.com
你得到了什么。您可以将.*
更改为[^<>]*
以匹配除<
和>
以外的任何字符:
使用以下正则表达式:
'<([^<>]*@[^<>]*)>'