Pertanyaan bagus! Ini adalah Biola menunjukkan cara mengkueri kecocokan ke dalam kumpulan hasil.
Dan inilah penjelasan panjangnya jika kueri di Fiddle tidak masuk akal :)
Saya menggunakan tabel bernama RegEx_Test
dengan kolom MyVal
. Berikut isi tabelnya:
MyVal
------------------------------
[A1][abc][B23][D123]a33[bx5]
[Z15][ax0][B0][F13]R3
[X215][A3A][J99]F33F33G24[43][R3]
[Z99][c1][F3][d33]3x24[Y3][f13]
[9a][D41][Q39][XX12]B27[T03][J12]
Regexp Anda secara keseluruhan adalah ini:\[[[:alpha:]][[:digit:]]{1,2}\]
. Itu sama seperti pada jawaban lain kecuali dengan POSIX :alpha:
dan :digit:
indikator, yang lebih aman untuk rangkaian karakter internasional.
Pertama, Anda perlu mengetahui jumlah maksimum kecocokan di baris mana pun. Gunakan REGEXP_COUNT
untuk ini:
SELECT MAX(REGEXP_COUNT(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]'))
FROM Regex_Test
MAX(REGEXP_COUNT(My...
----------------------
6
Gunakan jumlah maksimum itu untuk mendapatkan tabel "penghitung" (itulah SELECT ... FROM DUAL
di bawah) dan gabungkan silang tabel penghitung dengan kueri yang akan menarik nilai Anda menggunakan REGEXP_SUBSTR
. REGEXP_SUBSTR
memiliki parameter "kejadian" dan itu akan menggunakan Counter
:
SELECT
MyVal,
Counter,
REGEXP_SUBSTR(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]', 1, Counter) Matched
FROM Regex_Test
CROSS JOIN (
SELECT LEVEL Counter
FROM DUAL
CONNECT BY LEVEL <= (
SELECT MAX(REGEXP_COUNT(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]'))
FROM Regex_Test)) Counters
Berikut ini contoh yang dijalankan terhadap tabel saya (hasil sebagian):
MyVal Counter Matched
---------------------------------- ------- -------
[9a][D41][Q39][XX12]B27[T03][J12] 1 [D41]
[9a][D41][Q39][XX12]B27[T03][J12] 2 [Q39]
[9a][D41][Q39][XX12]B27[T03][J12] 3 [T03]
[9a][D41][Q39][XX12]B27[T03][J12] 4 [J12]
[9a][D41][Q39][XX12]B27[T03][J12] 5
[9a][D41][Q39][XX12]B27[T03][J12] 6
[A1][abc][B23][D123]a33[bx5] 1 [A1]
[A1][abc][B23][D123]a33[bx5] 2 [B23]
[A1][abc][B23][D123]a33[bx5] 3
... and so on - total is 30 rows
Pada titik ini Anda memiliki serangkaian hasil kecocokan individual, ditambah nol di mana satu baris memiliki kecocokan kurang dari maksimum. Pertandingan masih memiliki tanda kurung di sekitarnya. Kelilingi semuanya dengan kueri luar yang akan menyaring nol dan menghapus tanda kurung, dan Anda memiliki daftar akhir:
SELECT SUBSTR(Matched, 2, LENGTH(Matched)-2) FROM (
SELECT
MyVal,
Counter,
REGEXP_SUBSTR(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]', 1, Counter) Matched
FROM Regex_Test
CROSS JOIN (
SELECT LEVEL Counter
FROM DUAL
CONNECT BY LEVEL <= (
SELECT MAX(REGEXP_COUNT(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]'))
FROM Regex_Test)) Counters
) WHERE Matched IS NOT NULL
Ini adalah kueri yang ada di Fiddle, dan dapat digunakan di kueri lain.