> ## Documentation Index
> Fetch the complete documentation index at: https://villagesql.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# MySQL の REGEXP

> MySQL で REGEXP、RLIKE、および REGEXP_LIKE を使って正規表現を照合する方法、知っておく価値のあるアンカーとクラス、および大文字と小文字を区別する照合を強制する方法。

> [card] [VillageSQL is a drop-in replacement for MySQL with extensions.](https://villagesql.com/docs/en/8.4/stable/install-server.md)
>
> All examples on this page work on VillageSQL. Install Now →

`LIKE` は 2 つの文字で形を表します。`REGEXP` はパターン言語全体で形を表す
ため、`LIKE` には表現できない条件を指定できます。候補の中からの選択、
繰り返されるグループ、文字の範囲などです。

始める前に、`mysql -u root -p sakila` でクライアントを開いてください。

## REGEXP の仕組み

```sql theme={null}
SELECT COLUMN_LIST
FROM TABLE_NAME
WHERE COLUMN_NAME REGEXP 'PATTERN_TEXT';
```

`PATTERN_TEXT` を探したい正規表現に置き換えます。

条件は、パターンが値の中のどこかに一致したときに真になります。これが、値全体を
表さなければならない `LIKE` との最初の違いです。

以下で使う部品です。

| 部品 | 意味 |
| - | - |
| `^` | 値の先頭 |
| `$` | 値の末尾 |
| `.` | 任意の 1 文字 |
| `*` | 直前のものの任意回数の繰り返し |
| `[AB]` | 角かっこ内の文字のいずれか 1 つ |
| `(AL\|BE)` | いずれかの候補 |

## 例

### 先頭が一致する

```sql theme={null}
SELECT title FROM film WHERE title REGEXP '^ACA' ORDER BY title;
```

```text theme={null}
+------------------+
| title            |
+------------------+
| ACADEMY DINOSAUR |
+------------------+
1 row in set (0.01 sec)
```

`^` がなければ、パターンはタイトル内のどこにある `ACA` にも一致します。

### 末尾が一致する

```sql theme={null}
SELECT title FROM film WHERE title REGEXP 'GOLDFINGER$' ORDER BY title;
```

```text theme={null}
+----------------------+
| title                |
+----------------------+
| ACE GOLDFINGER       |
| BREAKFAST GOLDFINGER |
| SILVERADO GOLDFINGER |
+----------------------+
3 rows in set (0.00 sec)
```

### 2 つの先頭のいずれか

```sql theme={null}
SELECT first_name FROM actor WHERE first_name REGEXP '^(AL|BE)' ORDER BY first_name LIMIT 5;
```

```text theme={null}
+------------+
| first_name |
+------------+
| AL         |
| ALAN       |
| ALBERT     |
| ALBERT     |
| ALEC       |
+------------+
5 rows in set (0.00 sec)
```

`ALBERT` が 2 回現れるのは、2 人の俳優が同じ名前を持つためです。`SELECT` は
行を報告するのであって、重複を除いた値を報告するのではありません。

### LIKE には表せない形

これは、`A` または `B` で始まり `S` で終わるタイトルを求めます。

```sql theme={null}
SELECT title FROM film WHERE title REGEXP '^[AB].*S$' ORDER BY title LIMIT 5;
```

```text theme={null}
+----------------------+
| title                |
+----------------------+
| ADAPTATION HOLES     |
| AMELIE HELLFIGHTERS  |
| AMERICAN CIRCUS      |
| ANACONDA CONFESSIONS |
| ANALYZE HOOSIERS     |
+----------------------+
5 rows in set (0.00 sec)
```

### 一致しないものすべて

`NOT REGEXP` は、`NOT LIKE` と同じように、テストを反転します。

```sql theme={null}
SELECT title, rating
FROM film
WHERE title NOT REGEXP '^A'
ORDER BY title
LIMIT 5;
```

```text theme={null}
+---------------------+--------+
| title               | rating |
+---------------------+--------+
| BABY HALL           | NC-17  |
| BACKLASH UNDEFEATED | PG-13  |
| BADMAN DAWN         | R      |
| BAKED CLEOPATRA     | G      |
| BALLOON HOMEWARD    | NC-17  |
+---------------------+--------+
5 rows in set (0.00 sec)
```

NULL 値は `REGEXP` にも `NOT REGEXP` にも一致しません。どちらも NULL に対して
NULL を返すためです。[IS NULL](https://villagesql.com/docs/ja/tutorial/is-null.md) でそれを扱います。

## RLIKE は同じ演算子

```sql theme={null}
SELECT title FROM film WHERE title RLIKE '^ACA' ORDER BY title;
```

```text theme={null}
+------------------+
| title            |
+------------------+
| ACADEMY DINOSAUR |
+------------------+
1 row in set (0.00 sec)
```

`RLIKE` と `REGEXP` は 1 つの演算子の 2 つの綴りです。どちらかを選び、それを
使い続けてください。

## 大文字と小文字、およびその区別を強制する方法

パターンは、`LIKE` と同じく、照合対象の照合順序に従います。そのため、
デフォルトでは小文字のパターンが大文字のテキストに一致します。`REGEXP_LIKE()`
はこの演算子の関数形で、その第 3 引数がそれを上書きします。`'c'` は大文字と
小文字を区別するという意味です。

```sql theme={null}
SELECT REGEXP_LIKE('ACADEMY DINOSAUR', '^aca') AS default_mode,
       REGEXP_LIKE('ACADEMY DINOSAUR', '^aca', 'c') AS case_sensitive;
```

```text theme={null}
+--------------+----------------+
| default_mode | case_sensitive |
+--------------+----------------+
|            1 |              0 |
+--------------+----------------+
1 row in set (0.00 sec)
```

## LIKE で表せるときは LIKE を優先する

`REGEXP` 検索を絞り込めるインデックスはありません。一致がどこから始まっても
よいため、サーバーはすべての値をテストします。固定テキストで始まるパターンの
`LIKE` は、インデックスの一致する部分に直接ジャンプできます。どちらでも
フィルタを表現できるときは、`LIKE` のほうが 2 つのうちで安価です。
[LIKE](https://villagesql.com/docs/ja/tutorial/like.md) のレッスンで、どのパターンがインデックスを使え、
どれが使えないかを説明しています。

## まとめ

* 値の中のどこかにあるパターンを照合するには `REGEXP` を使います。
* 一致が先頭または末尾になければならないときは、`^` と `$` でアンカーします。
* `RLIKE` は `REGEXP` の別名として読みます。
* 大文字と小文字を区別する照合を強制するには `REGEXP_LIKE(value, pattern, 'c')` を使います。
* まず `LIKE` に手を伸ばします。`REGEXP` 検索を絞り込めるインデックスはないためです。

## 関連項目

* [LIKE](https://villagesql.com/docs/ja/tutorial/like.md) — より単純なパターン演算子
* [大文字と小文字の区別](https://villagesql.com/docs/ja/tutorial/case-sensitivity.md) — デフォルトを決めるもの
* [WHERE](https://villagesql.com/docs/ja/tutorial/where.md) — パターンを置く句
* [MySQL の全文検索](https://villagesql.com/docs/ja/guides/full-text-search.md) — 大規模なテキスト内の単語の検索
* [MySQL でのあいまい文字列一致](https://villagesql.com/docs/ja/guides/fuzzy-string-matching.md) — 近いが等しくないテキストの照合


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.