Riffing phương pháp này để tách một chuỗi trong khi cho phép các giá trị rỗng:
select regexp_substr('A~^B~^C~D^E','(.*?)(~\^|$)', 1, level, null, 1) from dual
connect by level < regexp_count('A~^B~^C~D^E','(.*?)(~\^|$)');
REGEXP_SUBS
-----------
A
B
C~D^E
Như trong câu trả lời được liên kết, nó tìm kiếm bất kỳ ký tự nào, không tham lam, theo sau là sự kết hợp của ~^
(với dấu mũ được thoát ra, vì vậy ~\^
) hoặc cuối dòng. regexp_substr()
lệnh gọi cũng sử dụng các đối số tùy chọn để chỉ định subexpr
- vì vậy nó chỉ nhận được nhóm đầu tiên (.*?
) chứ không phải chính dấu phân tách, nằm trong nhóm thứ hai.
Nếu bạn muốn một phần tử cụ thể thì phần tử đó thậm chí còn gần với bài đăng được liên kết hơn:
select regexp_substr('A~^B~^C~D^E','(.*?)(~\^|$)', 1, 3, null, 1) from dual;
REGEX
-----
C~D^E
Hoặc khi bạn đang thực hiện điều này trong một thủ tục, hãy sử dụng truy vấn kết nối theo từng phần để điền vào một tập hợp, sau đó chọn phần tử bạn cần, nếu bạn đang xem nhiều hơn một phần tử.