Oracleでは、REGEXP_INSTR()
関数は、文字列で正規表現パターンを検索します。一致した部分文字列の開始位置または終了位置(指定した方)を示す整数を返します。
INSTR()
の機能を拡張します 正規表現パターンを使用できるようにすることで機能します。
構文
構文は次のようになります:
REGEXP_INSTR ( source_char, pattern
[, position
[, occurrence
[, return_opt
[, match_param
[, subexpr ]
]
]
]
]
)
場所:
-
source_char
検索値として機能する文字式です。 pattern
は正規表現です。position
検索を開始する場所を指定する正の整数です。デフォルトは1
です 、つまり、最初の文字から検索を開始します。occurrence
検索するオカレンスを指定する正の整数です。デフォルトは1
です 、これは最初の出現を検索することを意味します。-
return_opt
Oracleが一致した部分文字列の開始位置と終了位置のどちらを返すかを指定します。0
を使用する 最初に、1
エンディングのために。デフォルト値は0
です 。 -
match_param
関数のデフォルトの一致動作を変更できます。たとえば、大文字と小文字の区別、複数の行とスペースの処理方法などを指定できます。この引数は、REGEXP_COUNT()
で使用した場合と同じように機能します。 働き。詳細については、その機能に関するOracleのドキュメントを参照してください。 pattern
の場合 部分式を使用して、subexpr
pattern
のどの部分式を示す0から9までの非負の整数です。 関数によって返されます。この引数は、REGEXP_INSTR()
で使用した場合と同じように機能します。 働き。その機能の詳細については、Oracleのドキュメントを参照してください。
例
REGEXP_INSTR()
を使用する基本的な例を次に示します。 Oracleの場合:
SELECT
REGEXP_INSTR('My dogs are fluffy', 'd.g')
FROM DUAL;
結果:
4
この場合、一致があり、部分文字列の開始位置が返されます。
正規表現は非常に強力である可能性があり、この例では非常に単純な例を使用しています。 REGEXP_INSTR()
を使用するには 事実上、望ましい結果を得るために使用する正しいパターンを知る必要があります。
一致なし
一致するものがない例を次に示します。
SELECT REGEXP_INSTR('My dogs like dregs', 't.g')
FROM DUAL;
結果:
0
一致するものがないため、0
返されます。
複数の一致
複数の一致がある例を次に示します。
SELECT
REGEXP_INSTR('My dogs have dags', 'd.g')
FROM DUAL;
結果:
4
最初の出現位置を返しました。
ただし、置き換えるオカレンスを指定できます:
SELECT
REGEXP_INSTR('My dogs have dags', 'd.g', 1, 2)
FROM DUAL;
結果:
14
ここに2つの引数を追加したことに注意してください。 1
および2
。 1
検索を開始する文字列の所在を指定します(この場合、最初の文字)。 2
検索するオカレンスを指定するものです。この場合、2番目のオカレンスが検索されます。
最初に検索を開始した後に検索を開始すると、次のようになります。
SELECT
REGEXP_INSTR('My dogs have dags', 'd.g', 8, 2)
FROM DUAL;
結果:
0
この場合、開始位置の後にオカレンスが1つしかないため、一致するものはありません。
最後の引数を1
に変更した場合 、次に一致します(指定された開始位置の後の最初の出現であるため):
SELECT
REGEXP_INSTR('My dogs have dags', 'd.g', 8, 1)
FROM DUAL;
結果:
14
終了位置を返す
0
のいずれかの5番目の引数を渡すことができます または1
関数が部分文字列の開始位置と終了位置のどちらを返すかを指定します。
デフォルト値は0
です (開始位置の場合)。 1
を指定するとどうなりますか :
SELECT
REGEXP_INSTR('My dogs are fluffy', 'd.g', 1, 1, 1)
FROM DUAL;
結果:
7
明確にするために、ここでも0
と比較した場合です。 :
SELECT
REGEXP_INSTR('My dogs are fluffy', 'd.g', 1, 1, 0) AS "Start",
REGEXP_INSTR('My dogs are fluffy', 'd.g', 1, 1, 1) AS "End"
FROM DUAL;
結果:
Start End ________ ______ 4 7
大文字と小文字の区別
REGEXP_INSTR()
関数は、文字列をパターンと照合するときに使用する照合を定義するOracleの照合決定および導出規則に従います。
ただし、オプションの6番目の引数を使用して、大文字と小文字の区別を明示的に指定できます。これを行うと、決定された照合の大文字と小文字の区別またはアクセントの区別が上書きされます。
i
を指定できます 大文字と小文字を区別しないマッチングとc
大文字と小文字を区別するマッチング用。
次に例を示します:
SELECT
REGEXP_INSTR('My Cats', 'c.t', 1, 1, 0) AS "Default",
REGEXP_INSTR('My Cats', 'c.t', 1, 1, 0, 'i') AS "Case Insensitive",
REGEXP_INSTR('My Cats', 'c.t', 1, 1, 0, 'c') AS "Case Sensitive"
FROM DUAL;
結果:
Default Case Insensitive Case Sensitive __________ ___________________ _________________ 0 4 0
これらの結果に基づくと、私の照合では大文字と小文字が区別されるようです。他の2つの文字列は、それぞれ大文字と小文字を区別しない一致と大文字と小文字を区別する一致を強制されました。
部分式
6番目の引数を使用して特定の部分式パターンを返す例を次に示します。
SELECT REGEXP_INSTR(
'catdogcow',
'(c.t)(d.g)(c.w)',
1, 1, 0, 'i', 1
)
FROM DUAL;
結果:
1
この場合、最初の部分式を返しました。
3番目の部分式を指定するとどうなりますか:
SELECT REGEXP_INSTR(
'catdogcow',
'(c.t)(d.g)(c.w)',
1, 1, 0, 'i', 3
)
FROM DUAL;
結果:
7
ヌル引数
6番目の引数を除いて、null
を提供します 引数の場合、結果はnull
になります :
SET NULL 'null';
SELECT
REGEXP_INSTR(null, 'c.t', 1, 1, 0, 'i', 1) AS "1",
REGEXP_INSTR('Cat', null, 1, 1, 0, 'i', 1) AS "2",
REGEXP_INSTR('Cat', 'c.t', null, 1, 0, 'i', 1) AS "3",
REGEXP_INSTR('Cat', 'c.t', 1, null, 0, 'i', 1) AS "4",
REGEXP_INSTR('Cat', 'c.t', 1, 1, null, 'i', 1) AS "5",
REGEXP_INSTR('Cat', 'c.t', 1, 1, 0, null, 1) AS "6",
REGEXP_INSTR('Cat', 'c.t', 1, 1, 0, 'i', null) AS "7"
FROM DUAL;
結果:
1 2 3 4 5 6 7 _______ _______ _______ _______ _______ ____ _______ null null null null null 0 null
デフォルトでは、SQLclおよびSQL * Plusは、null
の場合は常に空白を返します。 SQL SELECT
の結果として発生します 声明。
ただし、SET NULL
は使用できます 返される別の文字列を指定します。ここでは、文字列null
を指定しました 返却する必要があります。
引数の数が間違っています
関数に引数を渡さないか、少なすぎると、エラーが発生します:
SELECT REGEXP_INSTR()
FROM DUAL;
結果:
Error starting at line : 1 in command - SELECT REGEXP_INSTR() FROM DUAL Error at Command Line : 1 Column : 8 Error report - SQL Error: ORA-00938: not enough arguments for function 00938. 00000 - "not enough arguments for function" *Cause: *Action:
あまりにも多くの引数を渡す場合も同じことが当てはまります:
SELECT REGEXP_INSTR('Cat', 'c.t', 1, 1, 1, 'i', 1, 'oops')
FROM DUAL;
結果:
Error starting at line : 1 in command - SELECT REGEXP_INSTR('Cat', 'c.t', 1, 1, 1, 'i', 1, 'oops') FROM DUAL Error at Command Line : 1 Column : 8 Error report - SQL Error: ORA-00939: too many arguments for function 00939. 00000 - "too many arguments for function" *Cause: *Action:
詳細情報
REGEXP_INSTR()
関数(およびOracleの他の正規表現の実装)は、IEEE Portable Operating System Interface(POSIX)正規表現標準およびUnicodeコンソーシアムのUnicode正規表現ガイドラインに準拠しています。
REGEXP_INSTR()
の詳細と例については、Oracleのドキュメントを参照してください。 機能。