我得到了這個查詢,並想提取括號內的值。如何在Oracle中從正則表達式中提取組?
select de_desc, regexp_substr(de_desc, '\[(.+)\]', 1)
from DATABASE
where col_name like '[%]';
然而,它給了我與括號如「[測試]」的價值。我只想要「測試」。我如何修改查詢來獲取它?
我得到了這個查詢,並想提取括號內的值。如何在Oracle中從正則表達式中提取組?
select de_desc, regexp_substr(de_desc, '\[(.+)\]', 1)
from DATABASE
where col_name like '[%]';
然而,它給了我與括號如「[測試]」的價值。我只想要「測試」。我如何修改查詢來獲取它?
REGEXP_SUBSTR函數的第三個參數表示您想要開始搜索的目標字符串中的位置(在您的示例中爲de_desc
)。假設在字符串的給定部分找到匹配,它不會影響返回的內容。
在Oracle 11g中,函數有第六個參數,我想是你正在嘗試使用的,它表示你想要返回的捕獲組。正確使用的一個例子是:
SELECT regexp_substr('abc[def]ghi', '\[(.+)\]', 1,1,NULL,1) from dual;
當最後一個參數1
指示要返回的捕獲組的數量。
10克不會出現這個選項,但在你的情況下就可以實現同樣的結果:
select substr(match, 2, length(match)-2) from (
SELECT regexp_substr('abc[def]ghi', '\[(.+)\]') match FROM dual
);
,因爲你知道,比賽將在開始和結束時只有一個多餘的字符。 (或者,您可以使用RTRIM和LTRIM從結果的兩端刪除括號。)
您需要進行替換並使用匹配整個字符串的正則表達式模式。
select regexp_replace(de_desc, '.*\[(.+)\].*', '\1') from DATABASE;
恕我直言,這是最簡單,易於記憶,更靈活,因此最好的方式來做到這一點。 –
我會提醒任何人使用'REGEXP_REPLACE'來獲取捕獲組,如果模式不匹配,Oracle將返回整個值,而您可能需要的行爲是返回'null'。例如,'REGEXP_REPLACE('abcdefghi','。* \ [(。+)\]。*','\ 1')'(模式不匹配)返回'abcdefghi'。這讓我絆倒了一次。 – Jared
這裏的問題是Oracle正則表達式不提供返回捕獲組匹配的字符串部分的函數。你可以嘗試使用遞歸查詢(select ... from tab connect by ...),但是可能會出現性能問題。 – Cyryl1972
令人驚訝的是第6個參數在Oracle官方REGEXP_SUBSTR文檔中沒有提及。感謝您指出它的存在。 –