【问题标题】:oracle regular expression extracting string inside tagsoracle正则表达式提取标签内的字符串
【发布时间】:2013-08-03 13:49:01
【问题描述】:

这是为了我的练习,我有这样的文字:

 "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

请提供任何好的解决方案。

谢谢

【问题讨论】:

  • 完成一半是什么意思?这没有给你预期的结果吗?
  • @RohitJain,更新结果出乎意料。

标签: sql regex oracle


【解决方案1】:

您的正则表达式的问题是,&lt; 之后的第一个 .* 将匹配 @ 之前的所有字符,因为正则表达式中的 dot(.) 可以匹配除换行符以外的任何字符。因此,它甚至可以匹配 &lt;&gt;。以下是它与您的字符串匹配的方式:

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

所以,捕获的组是:

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

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

使用以下正则表达式:

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

【讨论】:

  • 还有一个问题,我已经手动为文本的单引号添加了额外的引号,还有其他方法可以只在一个查询中使用吗?
  • @ajmalmhd04。恐怕,我无法回答。没有Oracle DB经验。很抱歉。
  • 好的,没问题,让我深入研究正则表达式并等待其他人的答案。
  • @ajmalmhd04。我想这是转义单引号的正确方法。 See this post
  • 是的,同意,但我怎么知道我是否只有文本并直接使用查询来处理大数据?!
猜你喜欢
  • 2017-05-15
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多