- カテゴリ:
REGEXP_INSTR¶
文字列サブジェクト内の正規表現パターンの指定された出現の位置を返します。一致するものが見つからない場合、0を返します。
文字列関数(正規表現) もご参照ください。
構文¶
REGEXP_INSTR( <subject> , <pattern> [ , <position> [ , <occurrence> [ , <option> [ , <regexp_parameters> [ , <group_num> ] ] ] ] ] )
引数¶
必須:
subject
一致を検索する文字列です。
pattern
一致するパターンです。
オプション:
position
関数が一致の検索を開始する文字列の先頭からの文字数です。
デフォルト:
1
(一致の検索は左側の最初の文字から始まります)occurrence
一致するパターンの出現を指定します。この関数は、最初の
occurrence - 1
の一致をスキップします。デフォルト:
1
option
一致の最初の文字のオフセット(
0
)を返すか、一致の最後に続く最初の文字のオフセット(1
)を返すかを指定します。デフォルト:
0
regexp_parameters
一致の検索に使用される正規表現パラメーターを指定する1つ以上の文字の文字列です。サポートされている値は次のとおりです。
c
:大文字と小文字を区別します。i
:大文字と小文字を区別しません。m
:複数行モードです。e
:部分一致を抽出します。s
:「ワイルドカード」は改行にも一致します。
詳細については、 正規表現パラメーター のドキュメントをご参照ください。
デフォルト:
c
注釈
デフォルトでは、 REGEXP_INSTR は、件名の一致部分全体の開始または終了文字オフセットを返します。ただし、
e
(「抽出」のため)パラメーターが指定されている場合、 REGEXP_INSTR は、パターンの最初のサブ式に一致するサブジェクト部分の開始文字または終了文字のオフセットを返します。e
は指定されているものの、group_num
が指定されていない場合、group_num
はデフォルトで1(最初のグループ)になります。パターンにサブ式がない場合、 REGEXP_INSTR はe
が設定されていないかのように動作します。e
を使用する例については、このトピックの 例 をご参照ください。group_num
group_num
パラメーターは、抽出するグループを指定します。グループは、正規表現で括弧を使用して指定されます。group_num
が指定されている場合、Snowflakeは'e'
オプションが指定されていなくても抽出を許可します。'e'
が暗黙的に示されます。Snowflakeは最大1024個のグループをサポートします。
group_num
を使用する例については、このトピックの 例 をご参照ください。
使用上の注意¶
ポジションは0ベースではなく、1ベースです。例えば、「MAN」の文字「M」の位置は、0ではなく1です。
追加の使用上の注意については、正規表現関数の 一般的な使用上の注意 をご参照ください。
照合の詳細¶
Arguments with collation specifications are currently not supported.
例¶
基本的な例¶
次のいくつかの例では、このデータを使用します。
CREATE TABLE demo1 (id INT, string1 VARCHAR); INSERT INTO demo1 (id, string1) VALUES (1, 'nevermore1, nevermore2, nevermore3.') ;
一致する文字列を検索します。この場合、文字列は「nevermore」の後に1つの10進数が続きます(例: 「nevermore1」)。
select id, string1, regexp_substr(string1, 'nevermore\\d') AS "SUBSTRING", regexp_instr( string1, 'nevermore\\d') AS "POSITION" from demo1 order by id; +----+-------------------------------------+------------+----------+ | ID | STRING1 | SUBSTRING | POSITION | |----+-------------------------------------+------------+----------| | 1 | nevermore1, nevermore2, nevermore3. | nevermore1 | 1 | +----+-------------------------------------+------------+----------+
一致する文字列を検索しますが、文字列の1番目の文字ではなく、文字列の5番目の文字から開始します。
select id, string1, regexp_substr(string1, 'nevermore\\d', 5) AS "SUBSTRING", regexp_instr( string1, 'nevermore\\d', 5) AS "POSITION" from demo1 order by id; +----+-------------------------------------+------------+----------+ | ID | STRING1 | SUBSTRING | POSITION | |----+-------------------------------------+------------+----------| | 1 | nevermore1, nevermore2, nevermore3. | nevermore2 | 13 | +----+-------------------------------------+------------+----------+
一致する文字列を検索しますが、1番目の一致ではなく3番目の一致を探します。
select id, string1, regexp_substr(string1, 'nevermore\\d', 1, 3) AS "SUBSTRING", regexp_instr( string1, 'nevermore\\d', 1, 3) AS "POSITION" from demo1 order by id; +----+-------------------------------------+------------+----------+ | ID | STRING1 | SUBSTRING | POSITION | |----+-------------------------------------+------------+----------| | 1 | nevermore1, nevermore2, nevermore3. | nevermore3 | 25 | +----+-------------------------------------+------------+----------+
このクエリは、前のクエリとほぼ同じですが、 option
パラメーターを使用して、一致する式の位置、または一致する式の後にある最初の文字の位置を表示する方法を示します。
select id, string1, regexp_substr(string1, 'nevermore\\d', 1, 3) AS "SUBSTRING", regexp_instr( string1, 'nevermore\\d', 1, 3, 0) AS "START_POSITION", regexp_instr( string1, 'nevermore\\d', 1, 3, 1) AS "AFTER_POSITION" from demo1 order by id; +----+-------------------------------------+------------+----------------+----------------+ | ID | STRING1 | SUBSTRING | START_POSITION | AFTER_POSITION | |----+-------------------------------------+------------+----------------+----------------| | 1 | nevermore1, nevermore2, nevermore3. | nevermore3 | 25 | 35 | +----+-------------------------------------+------------+----------------+----------------+
このクエリは、最後の実際の出現を超えて出現を検索した場合、返される位置は0であることを示しています。
select id, string1, regexp_substr(string1, 'nevermore', 1, 4) AS "SUBSTRING", regexp_instr( string1, 'nevermore', 1, 4) AS "POSITION" from demo1 order by id; +----+-------------------------------------+-----------+----------+ | ID | STRING1 | SUBSTRING | POSITION | |----+-------------------------------------+-----------+----------| | 1 | nevermore1, nevermore2, nevermore3. | NULL | 0 | +----+-------------------------------------+-----------+----------+
キャプチャグループの例¶
このセクションでは、正規表現の「グループ」機能の使用方法を示します。
このセクションの最初のいくつかの例では、キャプチャグループを使用しません。このセクションは、いくつかの簡単な例から始まり、キャプチャグループを使用する例に続きます。
これらの例では、以下で作成された文字列を使用します。
CREATE TABLE demo2 (id INT, string1 VARCHAR); INSERT INTO demo2 (id, string1) VALUES -- A string with multiple occurrences of the word "the". (2, 'It was the best of times, it was the worst of times.'), -- A string with multiple occurrences of the word "the" and with extra -- blanks between words. (3, 'In the string the extra spaces are redundant.'), -- A string with the character sequence "the" inside multiple words -- ("thespian" and "theater"), but without the word "the" by itself. (4, 'A thespian theater is nearby.') ;
次の例は以下を探します。
「the」という単語
1つ以上の非単語文字が続く(例:単語を区切る空白)
1つ以上の単語文字が続く。
「単語文字」には、a〜zとA〜Zの文字だけでなく、アンダースコア(「_」)と10進数字0~9も含まれますが、空白、句読点などは含まれません。
select id, string1, regexp_substr(string1, 'the\\W+\\w+') as "SUBSTRING", regexp_instr(string1, 'the\\W+\\w+') as "POSITION" from demo2 order by id; +----+-------------------------------------------------------------+--------------+----------+ | ID | STRING1 | SUBSTRING | POSITION | |----+-------------------------------------------------------------+--------------+----------| | 2 | It was the best of times, it was the worst of times. | the best | 8 | | 3 | In the string the extra spaces are redundant. | the string | 7 | | 4 | A thespian theater is nearby. | NULL | 0 | +----+-------------------------------------------------------------+--------------+----------+
文字列の位置1から開始して、2番目の出現を探します
「the」という単語
1つ以上の非単語文字が続く
1つ以上の単語文字が続く。
select id, string1, regexp_substr(string1, 'the\\W+\\w+', 1, 2) as "SUBSTRING", regexp_instr(string1, 'the\\W+\\w+', 1, 2) as "POSITION" from demo2 order by id; +----+-------------------------------------------------------------+-------------+----------+ | ID | STRING1 | SUBSTRING | POSITION | |----+-------------------------------------------------------------+-------------+----------| | 2 | It was the best of times, it was the worst of times. | the worst | 34 | | 3 | In the string the extra spaces are redundant. | the extra | 22 | | 4 | A thespian theater is nearby. | NULL | 0 | +----+-------------------------------------------------------------+-------------+----------+
この例は前の例に似ていますが、キャプチャグループを追加します。このクエリは、一致全体の位置を返すのではなく、「グループ」(つまり括弧内の正規表現の部分に一致する部分文字列の部分のみの位置)を返します。この場合、戻り値は「the」の後の単語の位置になります。
select id, string1, regexp_substr(string1, 'the\\W+(\\w+)', 1, 2, 'e', 1) as "SUBSTRING", regexp_instr( string1, 'the\\W+(\\w+)', 1, 2, 0, 'e', 1) as "POSITION" from demo2 order by id; +----+-------------------------------------------------------------+-----------+----------+ | ID | STRING1 | SUBSTRING | POSITION | |----+-------------------------------------------------------------+-----------+----------| | 2 | It was the best of times, it was the worst of times. | worst | 38 | | 3 | In the string the extra spaces are redundant. | extra | 28 | | 4 | A thespian theater is nearby. | NULL | 0 | +----+-------------------------------------------------------------+-----------+----------+
'e'
(「抽出」)パラメーターを指定し、 group_num
を指定しない場合、グループ番号はデフォルトで1になります。
select id, string1, regexp_substr(string1, 'the\\W+(\\w+)', 1, 2, 'e') as "SUBSTRING", regexp_instr( string1, 'the\\W+(\\w+)', 1, 2, 0, 'e') as "POSITION" from demo2 order by id; +----+-------------------------------------------------------------+-----------+----------+ | ID | STRING1 | SUBSTRING | POSITION | |----+-------------------------------------------------------------+-----------+----------| | 2 | It was the best of times, it was the worst of times. | worst | 38 | | 3 | In the string the extra spaces are redundant. | extra | 28 | | 4 | A thespian theater is nearby. | NULL | 0 | +----+-------------------------------------------------------------+-----------+----------+
group_num
を指定すると、パラメーターの1つとして 'e'
(「抽出」)を指定しなかった場合でも、Snowflakeは抽出すると想定します。
select id, string1, regexp_substr(string1, 'the\\W+(\\w+)', 1, 2, '', 1) as "SUBSTRING", regexp_instr( string1, 'the\\W+(\\w+)', 1, 2, 0, '', 1) as "POSITION" from demo2 order by id; +----+-------------------------------------------------------------+-----------+----------+ | ID | STRING1 | SUBSTRING | POSITION | |----+-------------------------------------------------------------+-----------+----------| | 2 | It was the best of times, it was the worst of times. | worst | 38 | | 3 | In the string the extra spaces are redundant. | extra | 28 | | 4 | A thespian theater is nearby. | NULL | 0 | +----+-------------------------------------------------------------+-----------+----------+
この例では、最初の単語が A
である2単語パターンの最初、2番目、および3番目の一致から2番目の単語の位置を取得する方法を示します。これは、最後のパターンを超えようとするとSnowflakeが0を返すことも示しています。
CREATE TABLE demo3 (id INT, string1 VARCHAR); INSERT INTO demo3 (id, string1) VALUES (5, 'A MAN A PLAN A CANAL') ;select id, string1, regexp_substr(string1, 'A\\W+(\\w+)', 1, 1, 'e', 1) as "SUBSTRING1", regexp_instr( string1, 'A\\W+(\\w+)', 1, 1, 0, 'e', 1) as "POSITION1", regexp_substr(string1, 'A\\W+(\\w+)', 1, 2, 'e', 1) as "SUBSTRING2", regexp_instr( string1, 'A\\W+(\\w+)', 1, 2, 0, 'e', 1) as "POSITION2", regexp_substr(string1, 'A\\W+(\\w+)', 1, 3, 'e', 1) as "SUBSTRING3", regexp_instr( string1, 'A\\W+(\\w+)', 1, 3, 0, 'e', 1) as "POSITION3", regexp_substr(string1, 'A\\W+(\\w+)', 1, 4, 'e', 1) as "SUBSTRING4", regexp_instr( string1, 'A\\W+(\\w+)', 1, 4, 0, 'e', 1) as "POSITION4" from demo3; +----+----------------------+------------+-----------+------------+-----------+------------+-----------+------------+-----------+ | ID | STRING1 | SUBSTRING1 | POSITION1 | SUBSTRING2 | POSITION2 | SUBSTRING3 | POSITION3 | SUBSTRING4 | POSITION4 | |----+----------------------+------------+-----------+------------+-----------+------------+-----------+------------+-----------| | 5 | A MAN A PLAN A CANAL | MAN | 3 | PLAN | 9 | CANAL | 16 | NULL | 0 | +----+----------------------+------------+-----------+------------+-----------+------------+-----------+------------+-----------+
この例は、パターンの初出内にある最初、2番目、3番目のグループの位置を取得する方法を示しています。この場合、返される値は、単語 MAN
の個々の文字の位置です。
select id, string1, regexp_substr(string1, 'A\\W+(\\w)(\\w)(\\w)', 1, 1, 'e', 1) as "SUBSTR1", regexp_instr( string1, 'A\\W+(\\w)(\\w)(\\w)', 1, 1, 0, 'e', 1) as "POS1", regexp_substr(string1, 'A\\W+(\\w)(\\w)(\\w)', 1, 1, 'e', 2) as "SUBSTR2", regexp_instr( string1, 'A\\W+(\\w)(\\w)(\\w)', 1, 1, 0, 'e', 2) as "POS2", regexp_substr(string1, 'A\\W+(\\w)(\\w)(\\w)', 1, 1, 'e', 3) as "SUBSTR3", regexp_instr( string1, 'A\\W+(\\w)(\\w)(\\w)', 1, 1, 0, 'e', 3) as "POS3" from demo3; +----+----------------------+---------+------+---------+------+---------+------+ | ID | STRING1 | SUBSTR1 | POS1 | SUBSTR2 | POS2 | SUBSTR3 | POS3 | |----+----------------------+---------+------+---------+------+---------+------| | 5 | A MAN A PLAN A CANAL | M | 3 | A | 4 | N | 5 | +----+----------------------+---------+------+---------+------+---------+------+
追加の例¶
次の例は、単語 was
の出現に一致します。マッチングは、文字列の1番目の文字から始まり、最初の出現に続く文字の文字列内の位置を返します。
select regexp_instr('It was the best of times, it was the worst of times', '\\bwas\\b', 1, 1) as "result" from dual;
+--------+
| result |
|--------|
| 4 |
+--------+
次の例では、パターンに一致する文字列の一部の最初の文字のオフセットを返します。マッチングは、文字列の1番目の文字から始まり、パターンの最初の出現を返します。
select regexp_instr('It was the best of times, it was the worst of times', 'the\\W+(\\w+)',1,1,0) as "result" from dual;
+--------+
| result |
|--------|
| 8 |
+--------+
次の例は前の例と同じですが、 e
パラメーターを使用して、パターンの最初のサブ式に一致するサブジェクト部分の文字オフセットを返します(つまり、 the
の後の最初の単語文字セット)。
select regexp_instr('It was the best of times, it was the worst of times', 'the\\W+(\\w+)',1,1,0,'e') as "result" from dual;
+--------+
| result |
|--------|
| 12 |
+--------+
次の例は、2文字以上のアルファベット文字(大文字と小文字を区別しない)が前にある st
で終わる単語の出現に一致します。マッチングは、文字列の15番目の文字から始まり、最初の出現に続く文字の文字列内の位置を返します。
select regexp_instr('It was the best of times, it was the worst of times', '[[:alpha:]]{2,}st', 15, 1) as "result" from dual;
+--------+
| result |
|--------|
| 38 |
+--------+
例を準備します。
create or replace table message(body varchar(255));
insert into message values
('Hellooo World'),
('How are you doing today?'),
('the quick brown fox jumps over the lazy dog'),
('PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS');
最初に一致した最初の文字のオフセットを返します。
select body, regexp_instr(body, '\\b\\S*o\\S*\\b') as result from message;
---------------------------------------------+-----------------------------------+
body | result |
---------------------------------------------+-----------------------------------+
Hellooo World | 1 |
How are you doing today? | 1 |
the quick brown fox jumps over the lazy dog | 11 |
PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS | 0 |
---------------------------------------------+-----------------------------------+
サブジェクトの3番目の文字から始まる、最初の一致の最初の文字。
select body, regexp_instr(body, '\\b\\S*o\\S*\\b', 3) as result from message;
---------------------------------------------+--------------------------------------+
body | result |
---------------------------------------------+--------------------------------------+
Hellooo World | 3 |
How are you doing today? | 9 |
the quick brown fox jumps over the lazy dog | 11 |
PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS | 0 |
---------------------------------------------+--------------------------------------+
サブジェクトの3番目の文字から始まる3番目の一致の最初の文字。
select body, regexp_instr(body, '\\b\\S*o\\S*\\b', 3, 3) as result from message; ---------------------------------------------+-----------------------------------------+ body | result | ---------------------------------------------+-----------------------------------------+ Hellooo World | 0 | How are you doing today? | 19 | the quick brown fox jumps over the lazy dog | 27 | PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS | 0 | ---------------------------------------------+-----------------------------------------+
サブジェクトの3番目の文字から始まる3番目の一致の最後の文字。
select body, regexp_instr(body, '\\b\\S*o\\S*\\b', 3, 3, 1) as result from message;
---------------------------------------------+--------------------------------------------+
body | result |
---------------------------------------------+--------------------------------------------+
Hellooo World | 0 |
How are you doing today? | 24 |
the quick brown fox jumps over the lazy dog | 31 |
PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS | 0 |
---------------------------------------------+--------------------------------------------+
サブジェクトの3番目の文字から始まる3番目の一致の最後の文字、大文字と小文字を区別しないマッチング。
select body, regexp_instr(body, '\\b\\S*o\\S*\\b', 3, 3, 1, 'i') as result from message;
---------------------------------------------+-------------------------------------------------+
body | result |
---------------------------------------------+-------------------------------------------------+
Hellooo World | 0 |
How are you doing today? | 24 |
the quick brown fox jumps over the lazy dog | 31 |
PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS | 35 |
---------------------------------------------+-------------------------------------------------+
select body, regexp_instr(body, '\\S*(o)\\S*\\b', 1, 1, 0, 'i') as result from message;
---------------------------------------------+-------------------------------------------------+
body | result |
---------------------------------------------+-------------------------------------------------+
Hellooo World | 1 |
How are you doing today? | 1 |
the quick brown fox jumps over the lazy dog | 11 |
PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS | 9 |
---------------------------------------------+-------------------------------------------------+
select body, regexp_instr(body, '\\S*(o)\\S*\\b', 1, 1, 0, 'ie') as result from message;
---------------------------------------------+--------------------------------------------------+
body | result |
---------------------------------------------+--------------------------------------------------+
Hellooo World | 7 |
How are you doing today? | 2 |
the quick brown fox jumps over the lazy dog | 13 |
PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS | 10 |
---------------------------------------------+--------------------------------------------------+