Страхотен въпрос! Ето цигулка показващи как да заявите съвпаденията в набор от резултати.
И ето дългото обяснение в случай, че заявката във Fiddle няма смисъл :)
Използвам таблица с име RegEx_Test
с колона MyVal
. Ето съдържанието на таблицата:
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]
Вашият регулярен израз навсякъде е следният:\[[[:alpha:]][[:digit:]]{1,2}\]
. Същото е като в другия отговор, с изключение на POSIX :alpha:
и :цифра:код> индикатори, които са по-безопасни в случай на международни набори от знаци.
Първо, трябва да знаете максималния брой съвпадения на всеки ред. Използвайте REGEXP_COUNT
за това:
SELECT MAX(REGEXP_COUNT(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]'))
FROM Regex_Test
MAX(REGEXP_COUNT(My...
----------------------
6
Използвайте този максимален брой, за да получите таблица "брояч" (това е SELECT ... FROM DUAL
по-долу) и съединете кръстосано таблицата на брояча със заявка, която ще изтегли вашите стойности с помощта на REGEXP_SUBSTR
. REGEXP_SUBSTR
има параметър "срещане" и ще използва 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
Ето примерно изпълнение спрямо моята таблица (частични резултати):
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
В този момент имате набор от резултати от индивидуални съвпадения, плюс нули, където ред има по-малко от максималните съвпадения. Мачовете все още имат заобикалящите ги скоби. Заобиколете всичко с външна заявка, която ще филтрира нулата и ще премахне скобите, и ще имате своя окончателен списък:
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
Това е заявката, която е във Fiddle и може да се използва в друга заявка.