質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

1回答

2238閲覧

MySql 正規表現 特殊文字のエスケープ方法 REGEXP

tf2014

総合スコア75

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2022/12/18 23:01

編集2022/12/19 01:40

MySqlでREGEXPを使うときの特殊文字のエスケープの仕方の質問です。

仮に以下のようなファイルがあって、これをgrepしたら、バックスラッシュで特殊文字のエスケープが出来ます。

txt

1~$ cat regex.txt 2 3 This line ends with a dot. 4 [text] kaku kakko 5 {text} nami kakko 6 my ip is 192.168.1.99 7 slash / backslash \

grep

1 ~$ cat regex.txt | grep '\.' 2This line ends with a dot. 3my ip is 192.168.1.99 4 5~$ cat regex.txt | grep -e '\[' 6[text] kaku kakko 7 8~$ cat regex.txt | grep -e '\{' 9{text} nami kakko 10 11~$ cat regex.txt | grep -e '\\' 12slash / backslash \

同様のことをMYSQLでやりたいのですが、エラーになります。テーブル・データはすであるものとします。その既存のテーブルデータはこの通り。

mysql

1mysql> SELECT * from mytable; 2+-----+-----------------------------------------+ 3| 1 | This line ends with a dot. | 4| 2 | [text] kaku kakko | 5| 3 | {text} nami kakko | 6| 4 | my ip is 192.168.1.99 | 7| 5 | slash / backslash \ | 8+---+-------------------------------------------+

さて、上のテーブルを使って、以下のエラーが出るので、どう修正すればよいのかを教えてください。

mysql > SELECT * from mytable WHERE REGEXP '\.' ERROR 1064: You have an error in your SQL syntax; check the manual that corresponds to your MYSQL server version for the right syntax to use near 'regexp '\.' mysql > SELECT * from mytable WHERE REGEXP '\[' ERROR 1064: You have an error in your SQL syntax; check the manual that corresponds to your MYSQL server version for the right syntax to use near 'regexp '\['

REGEXPで特殊文字をエスケープする方法を教えてください。もしかすると、エスケープ以外、他に何か問題があるのでしょうか?

追記:
回答をよんでみて、質問が明確ではないと感じたので追記いたします。
テーブルはすでに作られていて、テキストもすでにインサートされているものとします。テーブルの作り方、インサートの仕方の質問ではありません。 REGEXPのエラーに関する質問です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/12/18 23:36

当たり前の話ですが、まずmysqlのマニュアルを調べてください。 create table Test(id integer, value varchar(100)); insert into Test(id, value) values(1, 'This line ends with a dot.'); insert into Test(id, value) values(2, '[text] kaku kakko'); insert into Test(id, value) values(3, '{text} nami kakko'); insert into Test(id, value) values(4, 'my ip is 192.168.1.99'); insert into Test(id, value) values(5, 'slash / backslash \\'); select * from Test; select * from Test where value regexp '\\.'; select * from Test where value regexp '\\['; select * from Test where value regexp '\\{'; select * from Test where value regexp '\\['; select * from Test where value regexp '\\\\';
退会済みユーザー

退会済みユーザー

2022/12/19 02:08

onlineだけでなくlocalの最新でも確認したw mysql> select version(); +-----------+ | version() | +-----------+ | 8.0.31 | +-----------+ 1 row in set (0.00 sec) mysql> create table Test(id integer, value varchar(100)); Query OK, 0 rows affected (0.06 sec) mysql> insert into Test(id, value) values(1, 'This line ends with a dot.'); Query OK, 1 row affected (0.01 sec) mysql> insert into Test(id, value) values(2, '[text] kaku kakko'); Query OK, 1 row affected (0.01 sec) mysql> insert into Test(id, value) values(3, '{text} nami kakko'); Query OK, 1 row affected (0.01 sec) mysql> insert into Test(id, value) values(4, 'my ip is 192.168.1.99'); Query OK, 1 row affected (0.00 sec) mysql> insert into Test(id, value) values(5, 'slash / backslash \\'); Query OK, 1 row affected (0.00 sec) mysql> select * from Test; +------+----------------------------+ | id | value | +------+----------------------------+ | 1 | This line ends with a dot. | | 2 | [text] kaku kakko | | 3 | {text} nami kakko | | 4 | my ip is 192.168.1.99 | | 5 | slash / backslash \ | +------+----------------------------+ 5 rows in set (0.01 sec) mysql> select * from Test where value regexp '\\.'; +------+----------------------------+ | id | value | +------+----------------------------+ | 1 | This line ends with a dot. | | 4 | my ip is 192.168.1.99 | +------+----------------------------+ 2 rows in set (0.00 sec) mysql> select * from Test where value regexp '\\['; +------+-------------------+ | id | value | +------+-------------------+ | 2 | [text] kaku kakko | +------+-------------------+ 1 row in set (0.00 sec) mysql> select * from Test where value regexp '\\{'; +------+-------------------+ | id | value | +------+-------------------+ | 3 | {text} nami kakko | +------+-------------------+ 1 row in set (0.00 sec) mysql> select * from Test where value regexp '\\['; +------+-------------------+ | id | value | +------+-------------------+ | 2 | [text] kaku kakko | +------+-------------------+ 1 row in set (0.00 sec) mysql> select * from Test where value regexp '\\\\'; +------+---------------------+ | id | value | +------+---------------------+ | 5 | slash / backslash \ | +------+---------------------+ 1 row in set (0.00 sec) mysql>
tf2014

2022/12/19 03:02

詳しい説明ありがとうございます。 私の問題は、... WHERE *列の名前* REGEX ...  の*列の名前*を忘れていたことが問題でした。 いろいろ、ありがとうございます。
guest

回答1

0

ベストアンサー

みなまで書く必要がありました?

SQL

1create table mytable ( 2id int primary key, 3val varchar(50) 4); 5 6insert into mytable values 7(1,'This line ends with a dot.'), 8(2,'[text] kaku kakko'), 9(3,'{text} nami kakko'), 10(4,'my ip is 192.168.1.99'), 11(5,'slash / backslash \\'); 12 13select * from mytable where val regexp '\\.';/*もしくは'\\\.'でもいける*/ 14select * from mytable where val regexp '\\[';/*もしくは'\\\['でもいける*/ 15select * from mytable where val regexp '\\{'; /*もしくは'{'や'\\\{'でもいける*/ 16select * from mytable where val regexp '\\\\';

一部過剰にエスケープしていたかもしれないので修正

投稿2022/12/19 00:16

編集2022/12/19 01:38
yambejp

総合スコア117669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tf2014

2022/12/19 01:16

回答、ありがとうございます。 試してみたのですが、`\\\.' でも、同じエラーが出てきます。 ‘ERROR 1064: You have an error in your SQL syntax; check the manual that corresponds to your MYSQL server version for the right syntax to use near 'regexp '\\\.' (もしかすると、キャラクターセットなどの変更をする必要があるのでしょうか…)
yambejp

2022/12/19 01:22

一応全体サンプルあげておきました。 検索したいカラムをちゃんと指定していますか?
tf2014

2022/12/19 01:58

>>「検索したいカラムをちゃんと指定していますか?」 ありがとうございます。 問題点はご指摘の通り、REGEXPのエスケープではなく、カラムを指定していないことでした。
tf2014

2022/12/20 00:27

これでやりたいことはできるようになったのですが、なぜ`\\.`, `\\{`なのかに疑問があります。 自分なりに考えたのですが、以下、まちがていますか? `\\`でバックスラッシュを作成、このバックスラッシュで`.`をエスケープする。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問