メインコンテンツまでスキップ
に最終更新

REGEXP_COUNT

説明​

REGEXP_COUNT 関数は、文字列内で指定した正規表現パターンに一致する箇所の数を数えます。引数には対象の文字列と正規表現パターンを指定します。一致する箇所の総数を返し、一致する箇所がない場合は 0 を返します。

「str」パラメータは string 型で、正規表現による検索の対象となる文字列です。

「pattern」パラメータは string 型で、対象の文字列との照合に使用する正規表現です。

文字クラスで照合する場合は、UTF-8 に対応する標準の文字クラスを使用してください。これにより、さまざまな言語の文字を正しく識別して処理できます。

使用できる文字クラス: https://github.com/google/re2/wiki/Syntax

構文​

REGEXP_COUNT(<str>, <pattern>)

パラメータ​

パラメータ説明
<str>正規表現で照合する対象の文字列。型: string
<pattern>対象の文字列との照合に使用する正規表現。型: string

戻り値​

  • 「str」内で正規表現「pattern」に一致する箇所の数を int 型で返します。一致する箇所がない場合は 0 を返します。

「pattern」または「str」が NULL の場合、あるいは両方が NULL の場合は NULL を返します。

「pattern」が無効な正規表現の場合はエラーになります。

例​

エスケープ文字を含む正規表現で文字列を照合します。

SELECT regexp_count('a.b:c;d', '[\\\\.:;]');
+--------------------------------------+
| regexp_count('a.b:c;d', '[\\\\.:;]') |
+--------------------------------------+
| 3 |
+--------------------------------------+

通常の文字「:」を表す正規表現で文字列を照合します。

SELECT regexp_count('a.b:c;d', ':');
+------------------------------+
| regexp_count('a.b:c;d', ':') |
+------------------------------+
| 1 |
+------------------------------+

文字クラス「[[:punct:]]」で句読点などの記号を照合します。

SELECT regexp_count('Hello, World!', '[[:punct:]]');
+----------------------------------------------+
| regexp_count('Hello, World!', '[[:punct:]]') |
+----------------------------------------------+
| 2 |
+----------------------------------------------+

「pattern」が NULL の場合

SELECT regexp_count("abc",NULL);
+------------------------+
| regexp_count("abc",NULL) |
+------------------------+
| NULL |
+------------------------+

「str」が NULL の場合

SELECT regexp_count(NULL,"abc");
+------------------------+
| regexp_count(NULL,"abc") |
+------------------------+
| NULL |
+------------------------+

両方の引数が NULL の場合

SELECT regexp_count(NULL,NULL);
+------------------------+
| regexp_count(NULL,NULL) |
+------------------------+
| NULL |
+------------------------+

テーブルに値を挿入し、各行に保存された文字列と正規表現を使用して照合します。


CREATE TABLE test_table_for_regexp_count (
id INT,
text_data VARCHAR(500),
pattern VARCHAR(100)
) PROPERTIES ("replication_num"="1");

INSERT INTO test_table_for_regexp_count VALUES
(1, 'HelloWorld', '[A-Z][a-z]+'),
(2, 'apple123', '[a-z]{5}[0-9]'),
(3, 'aabbcc', '(aa|bb|cc)'),
(4, '123-456-7890', '[0-9][0-9][0-9]'),
(5, 'test,data', ','),
(6, 'a1b2c3', '[a-z][0-9]'),
(7, 'book keeper', 'oo|ee'),
(8, 'ababab', '(ab)(ab)(ab)'),
(9, 'aabbcc', '(aa|bb|cc)'),
(10, 'apple,banana', '[aeiou][a-z]+');

SELECT id, regexp_count(text_data, pattern) as count_result FROM test_table_for_regexp_count ORDER BY id;

+------+--------------+
| id | count_result |
+------+--------------+
| 1 | 2 |
| 2 | 1 |
| 3 | 3 |
| 4 | 3 |
| 5 | 1 |
| 6 | 3 |
| 7 | 2 |
| 8 | 1 |
| 9 | 3 |
| 10 | 2 |
+------+--------------+

テーブルに値を挿入し、各行の文字列を固定の正規表現で照合します。

CREATE TABLE test_table_for_regexp_count (
id INT,
text_data VARCHAR(500),
pattern VARCHAR(100)
) PROPERTIES ("replication_num"="1");

INSERT INTO test_table_for_regexp_count VALUES
(1, 'HelloWorld', '[A-Z][a-z]+'),
(2, 'apple123', '[a-z]{5}[0-9]'),
(3, 'aabbcc', '(aa|bb|cc)'),
(4, '123-456-7890', '[0-9][0-9][0-9]'),
(5, 'test,data', ','),
(6, 'a1b2c3', '[a-z][0-9]'),
(7, 'book keeper', 'oo|ee'),
(8, 'ababab', '(ab)(ab)(ab)'),
(9, 'aabbcc', '(aa|bb|cc)'),
(10, 'apple,banana', '[aeiou][a-z]+');

SELECT id, regexp_count(text_data, 'e') as count_e FROM test_table_for_regexp_count WHERE text_data IS NOT NULL ORDER BY id;
+------+---------+
| id | count_e |
+------+---------+
| 1 | 1 |
| 2 | 1 |
| 3 | 0 |
| 4 | 0 |
| 5 | 1 |
| 6 | 0 |
| 7 | 3 |
| 8 | 0 |
| 9 | 0 |
| 10 | 1 |
+------+---------+

絵文字に一致する箇所の数を数えます。

SELECT regexp_count('🍔🍟🍕🌍', '🍔|🍟|🍕');
+----------------------------------------------------+
| regexp_count('🍔🍟🍕🌍', '🍔|🍟|🍕') |
+----------------------------------------------------+
| 3 |
+----------------------------------------------------+

「pattern」が無効な正規表現の場合はエラーになります。


SELECT regexp_count('Hello, World!', '[[:punct:');

ERROR 1105 (HY000): errCode = 2, detailMessage = (10.16.10.2)[INVALID_ARGUMENT]Could not compile regexp pattern: [[:punct:
Error: missing ]: [[:punct: