2011-10-13 33 views
37

Tôi nhận được truy vấn này và muốn trích xuất giá trị giữa các dấu ngoặc vuông.Làm thế nào để trích xuất nhóm từ biểu thức chính quy trong Oracle?

select de_desc, regexp_substr(de_desc, '\[(.+)\]', 1) 
from DATABASE 
where col_name like '[%]'; 

Tuy nhiên nó mang lại cho tôi giá trị bằng dấu ngoặc vuông như "[TEST]". Tôi chỉ muốn "TEST". Làm cách nào để sửa đổi truy vấn để nhận nó?

Trả lời

67

Tham số thứ ba của hàm REGEXP_SUBSTR cho biết vị trí trong chuỗi đích (de_desc trong ví dụ của bạn) nơi bạn muốn bắt đầu tìm kiếm. Giả sử một kết hợp được tìm thấy trong phần đã cho của chuỗi, nó không ảnh hưởng đến những gì được trả về.

Trong Oracle 11g, có tham số thứ sáu cho hàm, mà tôi nghĩ là những gì bạn đang cố gắng sử dụng, cho biết nhóm chụp bạn muốn trả lại. Ví dụ về sử dụng hợp lý sẽ là:

SELECT regexp_substr('abc[def]ghi', '\[(.+)\]', 1,1,NULL,1) from dual; 

Trường hợp thông số cuối cùng 1 cho biết số lượng nhóm chụp bạn muốn trả về.

10g không xuất hiện để có tùy chọn này, nhưng trong trường hợp của bạn, bạn có thể đạt được kết quả tương tự với:

select substr(match, 2, length(match)-2) from (
SELECT regexp_substr('abc[def]ghi', '\[(.+)\]') match FROM dual 
); 

kể từ khi bạn biết rằng một trận đấu sẽ có chính xác một nhân vật dư thừa vào lúc bắt đầu và kết thúc. (Ngoài ra, bạn có thể sử dụng RTRIM và LTRIM để xóa các dấu ngoặc từ cả hai đầu của kết quả.)

+0

Điều tuyệt vời là thông số thứ 6 không được đề cập trong tài liệu chính thức của REGEXP_SUBSTR của Oracle. Cảm ơn bạn đã chỉ ra nó tồn tại. –

14

Bạn cần thay thế và sử dụng mẫu regex khớp với toàn bộ chuỗi.

select regexp_replace(de_desc, '.*\[(.+)\].*', '\1') from DATABASE; 
+0

IMHO là cách đơn giản nhất, dễ nhớ, linh hoạt hơn và do đó là cách tốt nhất để thực hiện. –

+7

Tôi sẽ cảnh báo bất cứ ai sử dụng 'REGEXP_REPLACE' để có được nhóm chụp rằng nếu mẫu không khớp, Oracle sẽ trả về toàn bộ giá trị, trong khi hành vi bạn có thể muốn là trả về' null'. Ví dụ, 'REGEXP_REPLACE ('abcdefghi', '. * \ [(. +) \]. *', '\ 1')' (mẫu không khớp) trả về 'abcdefghi'. Điều này vấp tôi lên một lần. – Jared

+0

Vấn đề ở đây là Oracle regexp không cung cấp một hàm để trả về một phần của chuỗi được so khớp bởi nhóm chụp. Bạn có thể thử sử dụng truy vấn đệ quy (chọn ... từ tab kết nối bằng ...) nhưng hãy chờ đợi sự cố hiệu suất tiềm năng. – Cyryl1972

Các vấn đề liên quan