MySQLの正規表現は?LIKEとREGEXPの違いは?

7217 ワード

MySQLの正規表現は?LIKEとREGEXPの違いは?
1.Mysqlの正規表現はSQL言語のサブセットのみを使用し、基本的な文字、文字列に一致させることができます.
例:select*from wp_posts where post_name REGEXP'hello'は、カラムpost_を取得できます.nameにhelloを含むすべての行
REGEXP '.og' .は、正規表現の特殊な文字です.文字が一致することを表すので、dog、hog、mogなどが一致します.
注意:
LIKEとREGEXPの違いについて:LIKEは列全体に一致します.一致するテキストがカラム値にのみ表示される場合、LIKEはそれを見つけることができず、対応する行も返されません(もちろん、ワイルドカードを使用する場合を除きます).一方、REGEXPはカラム値内でマッチングされ、マッチングされたテキストがカラム値に現れると、REGEXPがそれを見つけ、対応する行が返されます.この場合、非常に重要な違いがあります(もちろん、位置決め記号^と$に適応すれば、カラムのサブセットではなくカラム全体をマッチングすることができます).
大文字と小文字の区別について:MySQLで正規表現が一致(バージョン3.23.4以降)大文字と小文字は区別されません.大文字と小文字を区別する場合は、where post_などのBINARYキーワードを使用します.name REGEXP BINARY 'Hello .000'
2.ORマッチングについて
2つの列の1つを検索するには、|を使用します.たとえば、select*from products where pro_id REGEXP '1000|2000' ORDER BY pro_id;
これにより、1000と2000が一致して返されます.もちろん、複数の|を使用して複数の列を一致させることができます.
3.いくつかの文字が一致しているだけです〔〕
例えば、このようにしてマッチングする〔0123456789〕は0〜9にマッチングすることができ、〔1〜4〕〔4〜9〕も合法的な範囲である.また、範囲は必ずしも数値ではなく、[a-z]は任意のアルファベット文字に一致する
例:SELECT prod_name FROM products WHERE prod_name REGEXP '[1-5] Ton' ORDER BY prod_name;
4.特殊文字に一致してを使用してエスケープ
\\.マッチング可能である.
\f改ページ
改行
\r折り返し
\tタブ
\縦タブ
注:\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
5.一致文字クラス
[:alnum:]任意のアルファベットと数字(通〔a-zA-Z 0-9〕)
[:alpha:]任意の文字(同[a-zA-Z])
[:blank:]スペースとタブ([\t])
[:digit:]任意の数値(同[0-9])
[:lower:]任意の小文字
[:upper:]任意の大文字
[:space:]スペースを含む任意の空白文字
6.複数のインスタンスを一致させ、重複するメタ文字について
*0個以上の一致
+1つ以上の一致({1,})
? 1つ以上のマッチング({0,1})
指定された数の一致
指定された数以上のマッチング
{n,m}マッチング数の範囲(m 255を超えない)
例:select prod_name from products where prod_name REGEXP'[[:DIGIT:]{4}',前述したように[:digit:]は任意の素子に一致するため,数値の幾何学である.{4}前の文字(任意の数字)が正確に3つ現れるように要求されているので[::digit:]]]{4}はつながっている任意の4桁の数字にマッチし、もちろん、上記の例でもREGEXP'[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'と書くことができます
7.ロケータ
^テキストの開始
&テキストの末尾
[[:<:>
[:>:]]語の末尾
これらのロケータを使用することで、REGEXPにLIKEのような役割を果たすことができる
-------------------------------------------------------------------------------
likeモード
likeは似ているという意味で、2つのパターンがあります.合計%
_単一の文字を表し、通常は定長のデータを検索するために使用され、例えばすべての王という3文字の人名を検出し、名前の列名をnameと仮定し、「王」の後ろに2つの_があることに注意する.
select name from    where name like ' __';

%は0文字以上の任意の文字を表し、王という名前のすべての人の名前を検出した場合
select name from    where name like ' %';

「華」を含むすべての人名を調べる
select name from    where name like '% %';

 
正規モード
^,マッチング文字列の開始位置,または上の例,すべての王という名前の人名を調べる
select name from    where name regexp '^ ';

 
$、すべての名前の末尾が「明」の人名であるかのように、文字列の終了位置に一致します.
select name from    where name regexp ' $';

 
.,,sql文は書かない
[...],一致[]に含まれる任意の文字,abcdef......xyzは[a-z]と略記でき,0123456789は[0-9]と略記でき,w/z/sの先頭の人名を問い合わせる
select name from    where name regexp '^[wzs]';

 
[^......],マッチングが[]に含まれない文字,例えばw/z/sの先頭以外の人名を検索する
select name from    where name regexp '^[^wzs]';

 
a|b|cは、AまたはAまたはA+のパフォーマンスを持つ従業員を調べ、パフォーマンス列名performanceを仮定するaまたはbまたはcと一致する.
select performance from    where performance regexp 'A-|A|A+';

*、0回以上繰り返し、javascriptの正則に詳しい方はご存知です
'str*'はst/str/strr/strrrにマッチします......
?,0回または1回繰り返す
'str?'st/strにマッチ可能
+を1回以上繰り返します.
'str+'はstr/strr/strrr/strrrrに一致します......
Javascriptの中の正則に比べて、ここの正則は簡略化版で、不活性マッチング/貪欲マッチングはなく、[]内ではwsdという文法もサポートされず、中国語もサポートされず、比較的簡単です.
注意すべき点は、この2つのモードを混用しないでください.likeモードは正規表現をサポートしていません.REGEXPモードも認識していません.合計%