素晴らしい質問です! これがフィドルです 一致を結果セットに照会する方法を示しています。
そして、フィドルのクエリが意味をなさない場合の長い説明があります:)
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:
を除いて、他の回答と同じです。 および:digit:
国際的なキャラクターセットの場合により安全な指標。
まず、任意の行の一致の最大数を知る必要があります。 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
「occurrence」パラメータがあり、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
この時点で、個々の一致の結果セットに加えて、行の最大一致数より少ないnullがあります。試合にはまだ周囲の括弧があります。 nullを除外して角かっこを削除する外部クエリで全体を囲むと、最終的なリストが作成されます。
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にあるクエリであり、別のクエリで使用できます。