Świetne pytanie! Oto skrzypce pokazuje, jak wyszukiwać dopasowania w zestawie wyników.
A oto długie wyjaśnienie na wypadek, gdyby zapytanie w Fiddle nie miało sensu :)
Używam tabeli o nazwie RegEx_Test
z kolumną MyVal
. Oto zawartość tabeli:
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]
Twoje wyrażenie regularne jest następujące:\[[[:alpha:]][[:digit:]]{1,2}\]
. Jest tak samo jak w drugiej odpowiedzi, z wyjątkiem POSIX :alpha:
i :digit:
wskaźniki, które są bezpieczniejsze w przypadku znaków międzynarodowych.
Najpierw musisz znać maksymalną liczbę meczów na dowolnej linii. Użyj REGEXP_COUNT
w tym celu:
SELECT MAX(REGEXP_COUNT(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]'))
FROM Regex_Test
MAX(REGEXP_COUNT(My...
----------------------
6
Użyj tej maksymalnej liczby, aby uzyskać tabelę „licznik” (jest to SELECT ... FROM DUAL
poniżej) i połącz krzyżowo tabelę liczników za pomocą zapytania, które pobierze Twoje wartości za pomocą REGEXP_SUBSTR
. REGEXP_SUBSTR
ma parametr "occurrence" i będzie używał 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
Oto przykładowy przebieg na mojej tabeli (wyniki częściowe):
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
W tym momencie masz zestaw wyników pojedynczych dopasowań, plus wartości null, w których wiersz miał mniej niż maksymalne dopasowania. Mecze nadal mają swoje otaczające nawiasy. Otocz całość zewnętrznym zapytaniem, które odfiltruje wartości null i usunie nawiasy, a otrzymasz ostateczną listę:
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
To jest zapytanie, które znajduje się na skrzypcach i może być użyte w innym zapytaniu.