MySQL 完全折りたたみクエリ正規マッチングの詳細な説明

MySQL 完全折りたたみクエリ正規マッチングの詳細な説明

概要

前の章では、クエリのフィルター条件について学習しました。MySQL では、like % ワイルドカードを使用してあいまい一致を実行できることを学びました。同様に、他の正規表現のマッチングもサポートしています。正規表現のマッチングを実行するには、MySQL の REGEXP 演算子を使用します。使い方といいね

に似ていますが、はるかに強力であり、非常に特殊で複雑なルール マッチングを実現できます。 REGEXP コマンドを使用して正規表現が一致すると、一致が真であれば 1 が返され、一致が真でなければ 0 が返されます。デフォルトで一致するルールが追加されていない場合、REGEXP は '%%' と同等になります。前に NOT を追加すると (NOT REGEXP)、NOT LIKE と同じになります。

マッチングパターン分析

次の表は、REGEXP 演算子に適用できる正規表現一致パターンの一覧です。説明は比較的詳細です。後で 1 つずつテストします。


マッチングパターン

説明する

^

入力文字列の先頭と一致します。 REGEXP オブジェクトの Multiline プロパティが設定されている場合、^ は '\n' または '\r' の後の位置にも一致します。

$

入力文字列の末尾に一致します。 REGEXP オブジェクトの Multiline プロパティが設定されている場合、$ は '\n' または '\r' の前の位置にも一致します。

「\n」を除く任意の 1 文字に一致します。 '\n' を含む任意の文字を一致させるには、'[.\n]' のパターンを使用します。

[….]

文字のコレクション。含まれている文字のいずれかと一致します。たとえば、「[abc]」は「plain」の「a」と一致します。

[^...]

一致しない文字のセット。文字列に含まれていない任意の文字と一致します。たとえば、「[^abc]」は「plain」の「p」と一致します。

[ナノメートル]

[0-9]、[az]、[AZ]など、mとnの間の任意の1文字に一致します。

*

直前の部分式と 0 回以上一致します。たとえば、a* は「a」と「ab」に一致します。 * {0,} と同等です。

+

直前の部分式と 1 回以上一致します。たとえば、「a+」は「ab」や「abc」に一致しますが、「a」には一致しません。 + は {1,} と同等です。

?

直前の部分式と 1 回以上一致します。たとえば、「a?」は「ab」と「a」に一致します。 ? は {0,1} と同等です。

a1| a2|a3

a1 または a2 または a3 に一致します。たとえば、「z|food」は「z」または「food」に一致します。 「(z|f)ood」は「zood」または「food」に一致します。

{n}

n は負でない整数です。特定の回数一致します。たとえば、「o{2}」は「Bob」の「o」とは一致しませんが、「food」の 2 つの「o」とは一致します。

{n,}

直前の部分式 n を複数回一致します。たとえば、「o{2,}」は「food」だけでなく「foodood」にも一致します。

{n,m}

n と m はどちらも負でない整数です (n <= m)。少なくとも n 回、最大 m 回一致します。

{,m}

直前の部分式に0回からm回一致します

(…)

要素の組み合わせ、つまりパターン要素を1つの要素に結合すること。たとえば、(do)*は0個以上のdoに一致することを意味します。

一致するパターン ^

文字列の最初の部分を一致させます。これは s で始まる文字列と一致します。一致する場合は 1 を返します。一致しない場合は 0 を返します。テーブルに適用すると、一致するデータが返されます。

mysql> 'selina' REGEXP '^s' を選択します。
+----------------------+
| 'selina' 正規表現 '^s' |
+----------------------+
| 1 |
+----------------------+
セット内の1行

mysql> 'aelina' REGEXP '^s' を選択します。
+----------------------+
| 'aelina' 正規表現 '^s' |
+----------------------+
| 0 |
+----------------------+
セット内の1行
mysql> user2 から * を選択します。
+----+--------+-----+----------+-----+
| ID | 名前 | 年齢 | 住所 | 性別 |
+----+--------+-----+----------+-----+
| 1 | ブランド | 21 | 福州 | 1 |
| 2 | ヘレン | 20 | 泉州 | 0 |
| 3 | ソル | 21 | 厦門 | 0 |
| 4 | 翁 | 33 | 貴州 | 1 |
| 5 | セリーナ | 25 | NULL | 0 |
+----+--------+-----+----------+-----+
5行セット

mysql> user2 から * を選択します where name REGEXP '^s';
+----+--------+-----+--------+-----+
| ID | 名前 | 年齢 | 住所 | 性別 |
+----+--------+-----+--------+-----+
| 3 | ソル | 21 | 厦門 | 0 |
| 5 | セリーナ | 25 | NULL | 0 |
+----+--------+-----+--------+-----+
2行セット

一致するパターン $

文字列の末尾から一致します。これは、名前が d で終わるデータと一致します。

mysql> user2 から * を選択します。
+----+--------+-----+----------+-----+
| ID | 名前 | 年齢 | 住所 | 性別 |
+----+--------+-----+----------+-----+
| 1 | ブランド | 21 | 福州 | 1 |
| 2 | ヘレン | 20 | 泉州 | 0 |
| 3 | ソル | 21 | 厦門 | 0 |
| 4 | 翁 | 33 | 貴州 | 1 |
| 5 | セリーナ | 25 | NULL | 0 |
+----+--------+-----+----------+-----+
5行セット

mysql> user2 から * を選択し、名前 REGEXP 'd$' を指定します。
+----+-------+-----+--------+-----+
| ID | 名前 | 年齢 | 住所 | 性別 |
+----+-------+-----+--------+-----+
| 1 | ブランド | 21 | 福州 | 1 |
+----+-------+-----+--------+-----+
セット内の1行

一致するパターン。

. は任意の 1 文字に一致します。次のスクリプトは、n の後に任意の文字が続くものに一致します。

mysql> user2 から * を選択します。
+----+--------+-----+----------+-----+
| ID | 名前 | 年齢 | 住所 | 性別 |
+----+--------+-----+----------+-----+
| 1 | ブランド | 21 | 福州 | 1 |
| 2 | ヘレン | 20 | 泉州 | 0 |
| 3 | ソル | 21 | 厦門 | 0 |
| 4 | 翁 | 33 | 貴州 | 1 |
| 5 | セリーナ | 25 | NULL | 0 |
+----+--------+-----+----------+-----+
5行セット

mysql> user2 から * を選択します。 where name REGEXP 'n.';
+----+--------+-----+--------+-----+
| ID | 名前 | 年齢 | 住所 | 性別 |
+----+--------+-----+--------+-----+
| 1 | ブランド | 21 | 福州 | 1 |
| 4 | 翁 | 33 | 貴州 | 1 |
| 5 | セリーナ | 25 | NULL | 0 |
+----+--------+-----+--------+-----+
3行セット

一致するパターン [...]

少なくとも 1 つの文字が条件を満たしていれば、括弧内の任意の 1 文字と一致することを意味します。次の例では、名前 brand と weng のみが b、w、z と一致できます。

mysql> user2 から * を選択します。
+----+--------+-----+----------+-----+
| ID | 名前 | 年齢 | 住所 | 性別 |
+----+--------+-----+----------+-----+
| 1 | ブランド | 21 | 福州 | 1 |
| 2 | ヘレン | 20 | 泉州 | 0 |
| 3 | ソル | 21 | 厦門 | 0 |
| 4 | 翁 | 33 | 貴州 | 1 |
| 5 | セリーナ | 25 | NULL | 0 |
+----+--------+-----+----------+-----+
5行セット

mysql> user2 から * を選択します。 where name REGEXP [bwz];
1064 - SQL 構文にエラーがあります。MySQL サーバーのバージョンに対応するマニュアルで、1 行目の '[bwz]' 付近で使用する正しい構文を確認してください。
mysql> user2 から * を選択します。名前は REGEXP '[bwz]' です。
+----+-------+-----+--------+-----+
| ID | 名前 | 年齢 | 住所 | 性別 |
+----+-------+-----+--------+-----+
| 1 | ブランド | 21 | 福州 | 1 |
| 4 | 翁 | 33 | 貴州 | 1 |
+----+-------+-----+--------+-----+
2行セット

一致するパターン [^...]

[^...] は文字列に含まれていない任意の文字と一致することを意味します。たとえば、「[^brand]」は「helen」の「h」、「sol」の「s」、「weng」の「w」、および「selina」の「s」に一致しますが、「brand」には一致しないため、フィルタリングされます。

mysql> user2 から * を選択します。
+----+--------+-----+----------+-----+
| ID | 名前 | 年齢 | 住所 | 性別 |
+----+--------+-----+----------+-----+
| 1 | ブランド | 21 | 福州 | 1 |
| 2 | ヘレン | 20 | 泉州 | 0 |
| 3 | ソル | 21 | 厦門 | 0 |
| 4 | 翁 | 33 | 貴州 | 1 |
| 5 | セリーナ | 25 | NULL | 0 |
+----+--------+-----+----------+-----+
5行セット

mysql> user2 から * を選択します。名前は REGEXP '[^brand]' です。
+----+--------+-----+----------+-----+
| ID | 名前 | 年齢 | 住所 | 性別 |
+----+--------+-----+----------+-----+
| 2 | ヘレン | 20 | 泉州 | 0 |
| 3 | ソル | 21 | 厦門 | 0 |
| 4 | 翁 | 33 | 貴州 | 1 |
| 5 | セリーナ | 25 | NULL | 0 |
+----+--------+-----+----------+-----+
4行セット

マッチングモード[nm]

[0-9]、[az]、[AZ] など、m と n の間の任意の 1 文字と一致します。次のコードでは、a から e の間にない要素 "sol" はすべて除外されます。

mysql> user2 から * を選択します。
+----+--------+-----+----------+-----+
| ID | 名前 | 年齢 | 住所 | 性別 |
+----+--------+-----+----------+-----+
| 1 | ブランド | 21 | 福州 | 1 |
| 2 | ヘレン | 20 | 泉州 | 0 |
| 3 | ソル | 21 | 厦門 | 0 |
| 4 | 翁 | 33 | 貴州 | 1 |
| 5 | セリーナ | 25 | NULL | 0 |
+----+--------+-----+----------+-----+
5行セット

mysql> user2 から * を選択します。名前は REGEXP '[ae]' です。
+----+--------+-----+----------+-----+
| ID | 名前 | 年齢 | 住所 | 性別 |
+----+--------+-----+----------+-----+
| 1 | ブランド | 21 | 福州 | 1 |
| 2 | ヘレン | 20 | 泉州 | 0 |
| 4 | 翁 | 33 | 貴州 | 1 |
| 5 | セリーナ | 25 | NULL | 0 |
+----+--------+-----+----------+-----+
4行セット

一致するパターン*

直前の部分式と 0 回以上一致します。たとえば、a* は「a」と「ab」に一致します。 * {0,} と同等です。 次の「e*g」は名前「weng」にのみ一致します。

mysql> user2 から * を選択します。
+----+--------+-----+----------+-----+
| ID | 名前 | 年齢 | 住所 | 性別 |
+----+--------+-----+----------+-----+
| 1 | ブランド | 21 | 福州 | 1 |
| 2 | ヘレン | 20 | 泉州 | 0 |
| 3 | ソル | 21 | 厦門 | 0 |
| 4 | 翁 | 33 | 貴州 | 1 |
| 5 | セリーナ | 25 | NULL | 0 |
+----+--------+-----+----------+-----+
5行セット

mysql> user2 から * を選択します。名前は REGEXP 'e*g' です。
+----+------+-----+--------+-----+
| ID | 名前 | 年齢 | 住所 | 性別 |
+----+------+-----+--------+-----+
| 4 | 翁 | 33 | 貴州 | 1 |
+----+------+-----+--------+-----+
セット内の1行

マッチングモード+

直前の部分式と 1 回以上一致します。たとえば、「a+」は「ab」や「abc」に一致しますが、「a」には一致しません。 + は {1,} と同等です。以下のスクリプトに示すように、条件は 1 から n 個以上の組み合わせと d によって満たされ、"brand" と "annd" のみが条件を満たします。

mysql> user2 から * を選択します。
+----+--------+-----+----------+-----+
| ID | 名前 | 年齢 | 住所 | 性別 |
+----+--------+-----+----------+-----+
| 1 | ブランド | 21 | 福州 | 1 |
| 2 | ヘレン | 20 | 泉州 | 0 |
| 3 | ソル | 21 | 厦門 | 0 |
| 4 | 翁 | 33 | 貴州 | 1 |
| 5 | セリーナ | 25 | NULL | 0 |
| 6 | アニー | 23 | 上海 | 0 |
| 7 | そして | 24 | 上海 | 1 |
+----+--------+-----+----------+-----+
7行セット

mysql> user2 から * を選択します。 where name REGEXP 'n+d';
+----+-------+-----+----------+-----+
| ID | 名前 | 年齢 | 住所 | 性別 |
+----+-------+-----+----------+-----+
| 1 | ブランド | 21 | 福州 | 1 |
| 7 | そして | 24 | 上海 | 1 |
+----+-------+-----+----------+-----+
2行セット

マッチングモード?

直前の部分式と 1 回以上一致します。たとえば、「a?」は「ab」と「a」に一致します。 ? は {0,1} と同等です。 e は 1 または 0 であり、l によって制限されるため、要件を満たすのは 3 つだけです。

mysql> user2 から * を選択します。
+----+--------+-----+----------+-----+
| ID | 名前 | 年齢 | 住所 | 性別 |
+----+--------+-----+----------+-----+
| 1 | ブランド | 21 | 福州 | 1 |
| 2 | ヘレン | 20 | 泉州 | 0 |
| 3 | ソル | 21 | 厦門 | 0 |
| 4 | 翁 | 33 | 貴州 | 1 |
| 5 | セリーナ | 25 | NULL | 0 |
| 6 | アニー | 23 | 上海 | 0 |
| 7 | そして | 24 | 上海 | 1 |
+----+--------+-----+----------+-----+
7行セット

mysql> user2 から * を選択します。名前が REGEXP 'e?l' の場合;
+----+--------+-----+----------+-----+
| ID | 名前 | 年齢 | 住所 | 性別 |
+----+--------+-----+----------+-----+
| 2 | ヘレン | 20 | 泉州 | 0 |
| 3 | ソル | 21 | 厦門 | 0 |
| 5 | セリーナ | 25 | NULL | 0 |
+----+--------+-----+----------+-----+
3行セット

パターンa1| a2|a3に一致します

a1 または a2 または a3 に一致します。たとえば、以下の「nn|en」はそれぞれ「anny」、「annd」および「helen」、「weng」に一致します。

mysql> user2 から * を選択します。
+----+--------+-----+----------+-----+
| ID | 名前 | 年齢 | 住所 | 性別 |
+----+--------+-----+----------+-----+
| 1 | ブランド | 21 | 福州 | 1 |
| 2 | ヘレン | 20 | 泉州 | 0 |
| 3 | ソル | 21 | 厦門 | 0 |
| 4 | 翁 | 33 | 貴州 | 1 |
| 5 | セリーナ | 25 | NULL | 0 |
| 6 | アニー | 23 | 上海 | 0 |
| 7 | そして | 24 | 上海 | 1 |
+----+--------+-----+----------+-----+
7行セット

mysql> user2 から * を選択します。name REGEXP 'nn|en';
+----+-------+-----+----------+-----+
| ID | 名前 | 年齢 | 住所 | 性別 |
+----+-------+-----+----------+-----+
| 2 | ヘレン | 20 | 泉州 | 0 |
| 4 | 翁 | 33 | 貴州 | 1 |
| 6 | アニー | 23 | 上海 | 0 |
| 7 | そして | 24 | 上海 | 1 |
+----+-------+-----+----------+-----+
4行セット

パターン {n} {n,} {n,m} {,m} に一致します

n と m はどちらも負でない整数です (n <= m)。少なくとも n 回、最大 m 回一致します。 m は空で n 以上の任意の数を表し、n は空で 0 を表します。

mysql> user2 から * を選択します。
+----+--------+-----+----------+-----+
| ID | 名前 | 年齢 | 住所 | 性別 |
+----+--------+-----+----------+-----+
| 1 | ブランド | 21 | 福州 | 1 |
| 2 | ヘレン | 20 | 泉州 | 0 |
| 3 | ソル | 21 | 厦門 | 0 |
| 4 | 翁 | 33 | 貴州 | 1 |
| 5 | セリーナ | 25 | NULL | 0 |
| 6 | アニー | 23 | 上海 | 0 |
| 7 | そして | 24 | 上海 | 1 |
+----+--------+-----+----------+-----+
7行セット

mysql> user2 から * を選択します。名前 REGEXP 'n{2}';
+----+------+-----+---------+-----+
| ID | 名前 | 年齢 | 住所 | 性別 |
+----+------+-----+---------+-----+
| 6 | アニー | 23 | 上海 | 0 |
| 7 | そして | 24 | 上海 | 1 |
+----+------+-----+---------+-----+
2行セット

mysql> user2 から * を選択します。ここで、名前は REGEXP 'n{1,2}' です。
+----+--------+-----+----------+-----+
| ID | 名前 | 年齢 | 住所 | 性別 |
+----+--------+-----+----------+-----+
| 1 | ブランド | 21 | 福州 | 1 |
| 2 | ヘレン | 20 | 泉州 | 0 |
| 4 | 翁 | 33 | 貴州 | 1 |
| 5 | セリーナ | 25 | NULL | 0 |
| 6 | アニー | 23 | 上海 | 0 |
| 7 | そして | 24 | 上海 | 1 |
+----+--------+-----+----------+-----+
6行セット

mysql> user2 から * を選択します。名前は REGEXP 'l{1,}' です。
+----+--------+-----+----------+-----+
| ID | 名前 | 年齢 | 住所 | 性別 |
+----+--------+-----+----------+-----+
| 2 | ヘレン | 20 | 泉州 | 0 |
| 3 | ソル | 21 | 厦門 | 0 |
| 5 | セリーナ | 25 | NULL | 0 |
+----+--------+-----+----------+-----+
3行セット

パターンに一致します(...)

括弧の内容が abc であると仮定すると、abc 全体が一致し、このルールを満たすデータがフィルタリングされます。を例に挙げて、上で学んだ知識と組み合わせてみましょう。

mysql> user2 から * を選択します。
+----+--------+-----+----------+-----+
| ID | 名前 | 年齢 | 住所 | 性別 |
+----+--------+-----+----------+-----+
| 1 | ブランド | 21 | 福州 | 1 |
| 2 | ヘレン | 20 | 泉州 | 0 |
| 3 | ソル | 21 | 厦門 | 0 |
| 4 | 翁 | 33 | 貴州 | 1 |
| 5 | セリーナ | 25 | NULL | 0 |
| 6 | アニー | 23 | 上海 | 0 |
| 7 | そして | 24 | 上海 | 1 |
+----+--------+-----+----------+-----+
7行セット

mysql> user2 から * を選択します。name REGEXP '(an)+';
+----+-------+-----+----------+-----+
| ID | 名前 | 年齢 | 住所 | 性別 |
+----+-------+-----+----------+-----+
| 1 | ブランド | 21 | 福州 | 1 |
| 6 | アニー | 23 | 上海 | 0 |
| 7 | そして | 24 | 上海 | 1 |
+----+-------+-----+----------+-----+
3行セット

mysql> user2 から * を選択します。名前は REGEXP '(ann)+' です。
+----+------+-----+---------+-----+
| ID | 名前 | 年齢 | 住所 | 性別 |
+----+------+-----+---------+-----+
| 6 | アニー | 23 | 上海 | 0 |
| 7 | そして | 24 | 上海 | 1 |
+----+------+-----+---------+-----+
2行セット

mysql> user2 から * を選択します。名前は REGEXP '(an).*d{1,2}' です。
+----+-------+-----+----------+-----+
| ID | 名前 | 年齢 | 住所 | 性別 |
+----+-------+-----+----------+-----+
| 1 | ブランド | 21 | 福州 | 1 |
| 7 | そして | 24 | 上海 | 1 |
+----+-------+-----+----------+-----+
2行セット

特殊文字に一致します \\

正規表現言語は、特定の意味を持つ特殊文字で構成されています。 .、[]、|、*、+ などを見てきました。これらの文字をどのように一致させるのでしょうか?次の例では、特殊文字を一致させるために \\ を使用します。\\ は先頭文字、\\- は - の検索を意​​味し、\\. は . の検索を意​​味します。

mysql> user3 から * を選択します。
+----+------+-------+
| ID | 年齢 | 名前 |
+----+------+-------+
| 1 | 20 | ブランド |
| 2 | 22 | ソル |
| 3 | 20 | ヘレン |
| 4 | 19.5 | 日 |
+----+------+-------+
4行セット

mysql> select * from user3 where age REGEXP '[0-9]+\\.[0-9]+';
+----+------+------+
| ID | 年齢 | 名前 |
+----+------+------+
| 4 | 19.5 | 日 |
+----+------+------+
セット内の1行

要約する

1. 正規表現を使用してデータを一致させる必要がある場合は、REGEXP 演算子と NOT REGEXP 演算子 (LIKE と NOT LIKE に類似) を使用できます。

2. REGEXP はデフォルトでは大文字と小文字を区別しませんが、BINARY キーワードを使用して大文字と小文字を区別するように強制できます。WHERE NAME REGEXP BINARY '^[AZ]';

3. REGEXP はデフォルトで部分一致になり、一致する場合は true を返します。たとえば、SELECT 'A123' REGEXP BINARY '[AZ]' は 1 を返します。

4. () を使用して一致させる場合、括弧内のコンテンツ全体が一致します。たとえば、(ABC) は ABC 全体に一致する必要があります。

5. これは正規表現の基本の紹介にすぎません。より深く理解したい場合は、よく書かれている正規表現のチュートリアルを参照してください。

これで、MySQL クエリの正規マッチングの詳細な説明に関するこの記事は終了です。MySQL クエリの正規マッチングの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQLで正規表現クエリを使用する方法
  • mysql 正規表現クエリに数字以外の文字のレコードが含まれています
  • MySql で正規表現クエリを使用する方法
  • MySql の基本クエリ、結合クエリ、サブクエリ、正規表現クエリの詳細な説明
  • 正規表現を使用した MySQL クエリ操作の典型的な例のまとめ
  • MySql 公式マニュアル学習ノート 2 MySql ファジークエリと正規表現

<<:  Docker ベースの GitLab 環境をデプロイする方法と手順

>>:  JS配列メソッドsome、every、findの使用に関する詳細

推薦する

Windows 8 での MySQL 5.6.15 のインストールと設定方法のグラフィック チュートリアル

MySQLは私がとても気に入っているデータベースです。今日はWindows 8システムでインストール...

電子署名を実装するWeChatミニプログラム

この記事では、WeChatミニプログラムで電子署名を実装するための具体的なコードを参考までに紹介しま...

数百万のデータに対して MySQL クエリを最適化する 4 つの方法

目次1. 時間が経つにつれて限界が遅くなる理由2. 百万データシミュレーション1. 従業員テーブルと...

MySQL INT型の完全な分析

序文: Integer は MySQL で最もよく使用されるフィールド型の 1 つで、通常は整数を格...

WeChatアプレットが計算機機能を実装

この記事では、WeChatアプレットの計算機機能を実装するための具体的なコードを参考までに紹介します...

よく理解しましたかタグ 定義方法 使用方法

序文:今日、「<!DOCTYPE> タグを注意深く理解しましたか?」と尋ねられました。私...

純粋な CSS ドロップダウン メニュー

成果を達成する実装コードhtml <div id="コンテナ"> &...

10分でCSS3グリッドレイアウトを理解する

基本的な紹介前回の記事では、CSS3 のフレックスボックスを紹介しました。今日は、CSS3 のもう ...

Chrome、Firefox、IEで入力カーソルの位置がずれる問題の解決方法

ブラウザで入力カーソルがずれる問題の詳しい説明<br />仕事で問題に遭遇し、解決策を探...

React+tsは二次リンク効果を実現します

この記事では、二次リンク効果を実現するためのReact+tsの具体的なコードを参考までに共有します。...

Windows 10 で Hyper-V サービスをシャットダウンするいくつかの方法

VMware Workstation を使用して Windows 10 で仮想マシンを開くと、VMw...

Docker+Jenkins+Gitlab+Djangoアプリケーションデプロイ実践の詳細な説明

1. 背景インターネット アプリケーションの急速な更新と反復という状況では、従来の手作業や単純なスク...

MySQL ルート パスワードをリセットするときに発生する「不明な列 'password'」問題を解決する方法

夜にMACの電源を入れたところ、突然ルートアカウントがMySQLに正常にログインできなくなったため、...

ドロップダウンリストのJavaScript実装

この記事の例では、ドロップダウンリストを実装するためのJavaScriptの具体的なコードを参考まで...