2013-08-02 83 views
2

這是我的實踐,我有一個文本,如:Oracle正則表達式提取字符串內標籤

"lovely heart"<[email protected]>, 
"<<*>>Freeeky<<*>> Jack" <[email protected]>, 
"heavens's kingk*ng '-'asdf" <[email protected]> 
"sample[^-^]"<[email protected]> 

我只需要提取:

[email protected] 
[email protected] 
[email protected] 
[email protected] 

這裏是我的嘗試,但仍然是其一半或更少完成。

WITH t AS 
    (SELECT '"lovely heart"<[email protected]>, 
"<<*>>Freeeky<<*>> Jack" <[email protected]>, 
"heavens''s kingk*ng ''-''asdf" <[email protected]>' word 
    FROM dual 
    ) 
SELECT regexp_substr(word, '<(.*@.*)>',1,LEVEL, NULL,1) 
FROM t 
    CONNECT BY level <= regexp_count(word, '<(.*@.*)>'); 

一些結果是這樣的:

<*>>Freeeky<<*>> Jack" <[email protected] 

什麼好的解決辦法,請。

感謝

+0

你是什麼意思了一半呢?這沒有給你預期的結果? –

+0

@RohitJain,更新了意想不到的結果。 – ajmalmhd04

回答

2

與您正則表達式時,<後的第一.*@之前匹配所有角色的問題,作爲一個正則表達式可以dot(.)匹配除換行符任何字符。所以它甚至會匹配<>。下面是它的字符串匹配:

'"< <<*>>Freeeky<<*>> Jack" <[email protected] >"' 
^^          ^^ 
    | ----------------------------------------- | 
    |      |      | 
Match the first `<` (.*@.*)   Match the last `>`. 

因此,捕獲組是:

<<*>>Freeeky<<*>> Jack" <[email protected] 

哪個是你了。您可以更改.*[^<>]*匹配除了<>任何字符:

使用以下正則表達式:

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

這很完美。並讓我研究它:) – ajmalmhd04

+0

還有一個問題,我已經爲文本的單引號手動添加了額外的引號,還有其他方式只能在一個查詢中使用嗎? – ajmalmhd04

+0

@ ajmalmhd04。我害怕,我無法回答。沒有Oracle DB的經驗。對不起。 –