MySQL における Regexp の一般的な使用法 特定の文字列を含むあいまい一致 # コンテンツフィールドに「Car Club」を含むレコードを検索 club_content から * を選択します。コンテンツ正規表現は 'Car Club' です。
# regexpとlikeの次の使用法は同等です club_content から * を選択し、'%車友俱乐部%' のようなコンテンツを選択します
特定の文字列から始まるあいまい一致 # コンテンツフィールドで「车友」で始まるレコードを検索します club_content から * を選択します。コンテンツ正規表現は '^车友' です。
# regexpとlikeの次の使用法は同等です club_content から * を選択し、'車友%' のようなコンテンツを選択します
特定の文字列で終わるあいまい一致 # コンテンツフィールドが「车友」で終わるレコードを検索 club_content から * を選択します。コンテンツ正規表現は '車友$' です。
# regexpとlikeの次の使用法は同等です club_content から * を選択し、'%車友' のようなコンテンツを選択します
あいまい一致、または関係 # コンテンツフィールドで「経験」、「共有」、または「技術的な投稿」を検索します club_content から * を選択します。コンテンツは REGEXP '経験|共有|技術投稿' です。
単一文字を含まないあいまい一致 # コンテンツフィールドに「车」または「友」という単語を含まないレコードを検索します club_content から * を選択、コンテンツは REGEXP [^rider] です
結果を見て驚きました。すべての記録が表示されました。なぜでしょうか? 角括弧「[]」が追加されると、その中のコンテンツは個々の文字に分割されてからマッチングされます。各文字を1つずつマッチングして、「车」と「友」のどちらに等しいかを判断します。返される結果は、論理値0と1のセットです。 特定の文字列を含まない文字列を一致させたい場合、どうすれば実現できるでしょうか? 特定の文字列を含まないあいまい一致 # コンテンツフィールドに文字列「车友」が含まれていないレコードを検索します club_content から * を選択 (コンテンツが REGEXP 'rider' ではない)
文字列に一致するMySql REGEXP演算子 1 ^ は、この文字の次の文字で始まる文字列に一致します。たとえば、REGEXP '^x' は、x で始まる文字に一致することを意味します。 2 $は、その前の文字で終わる文字列に一致します。例: REGEXP 'y$'は、yで終わる文字に一致することを意味します。 3. 任意の文字に一致 4 [...] 角括弧内の任意の 1 文字と一致します。 例えば、[1-9]は1から9までの数字に一致し、[abc]はそのうちのいずれかに一致します。 5 *は、その前に続く0個以上の文字に一致します。例: x*は、任意の数のx文字に一致します。
MySQLで文字列が数値かどうかを判断する方法 この質問は少し奇妙ですが、多くの場合、数値は文字列の形式で保存され、数学演算に文字列を使用すると、何も問題がないように思われます。ただし、数学演算に使用される文字列は、数値に変換できません。 しかし、文字列を数値に変換できるかどうかをどのように判断するのでしょうか? MySQL の REGEXP 演算子を使用します。使い方は? {文字列} 正規表現 '[^0-9.]'
前の文字列は判断する必要があるもので、後ろの文字列は MySQL 正規表現であり、数字や小数点以外の文字に一致することを意味します。 文字列に 0 ~ 9 以外の数字または小数点が含まれている場合は true を返し、それ以外の場合は false を返します。 例えば: select ('123a' REGEXP '[^0-9.]'); --'123a' には文字 'a' が含まれています。出力は 1 です。MySQL の定数 true は 1 として出力され、false は 0 として出力されます。
注: 文字列にスペースが含まれている場合も、正規表現が一致し、1 が返されます。両端のスペースを削除する場合は、文字列に対して trim() 関数を使用する必要があります。 これは、REGEXP 演算子の単純な応用例です。REGEXP の詳細な応用例については、公式ドキュメントを参照してください。
MySQL 正規表現 前の章では、MySQL が LIKE ...% を通じてファジー マッチングを実行できることを学びました。 MySQL は他の正規表現のマッチングもサポートしています。MySQL では、正規表現のマッチングに REGEXP 演算子が使用されます。 PHP または Perl を知っていれば、MySQL の正規表現マッチングはそれらのスクリプトに似ているため、これは非常に簡単です。 次の表の正規表現パターンは、REGEXP 演算子で使用できます。 モデル | 説明する |
---|
^ | 入力文字列の先頭と一致します。 RegExp オブジェクトの Multiline プロパティが設定されている場合、^ は '\n' または '\r' の後の位置にも一致します。 | $ | 入力文字列の末尾に一致します。 RegExp オブジェクトの Multiline プロパティが設定されている場合、$ は '\n' または '\r' の前の位置にも一致します。 | 。 | 「\n」を除く任意の 1 文字に一致します。 '\n' を含む任意の文字を一致させるには、'[.\n]' のようなパターンを使用します。 | [...] | 文字のコレクション。含まれている文字のいずれかと一致します。たとえば、「[abc]」は「plain」の「a」と一致します。 | [^...] | 否定文字のセット。文字列に含まれていない任意の文字と一致します。たとえば、「[^abc]」は「plain」の「p」と一致します。 | 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 続き | p1 または p2 または p3 に一致します。たとえば、「z|food」は「z」または「food」に一致します。 「(z|f)ood」は「zood」または「food」に一致します。 | * | 直前の部分式と 0 回以上一致します。たとえば、zo* は「z」と「zoo」に一致します。 * {0,} と同等です。 | + | 直前の部分式と 1 回以上一致します。たとえば、「zo+」は「zo」や「zoo」に一致しますが、「z」には一致しません。 + は {1,} と同等です。 | {n} | n は負でない整数です。特定の回数一致します。たとえば、「o{2}」は「Bob」の「o」とは一致しませんが、「food」の 2 つの「o」とは一致します。 | {n,m} | m と n は両方とも負でない整数です(n <= m)。少なくとも n 回、最大 m 回一致します。 |
例 上記の正規の要件を理解した後、ニーズに応じて正規表現を使用して SQL ステートメントを記述できます。以下に、理解を深めるためにいくつかの小さな例 (テーブル名: person_tbl) を示します。 名前フィールドで「st」で始まるすべてのデータを検索します。 mysql> name を SELECT FROM person_tbl WHERE name REGEXP '^st';
名前フィールドが「ok」で終わるすべてのデータを検索します。 mysql> name を SELECT FROM person_tbl WHERE name REGEXP 'ok$';
名前フィールドに文字列「mar」を含むすべてのデータを検索します。 mysql> name FROM person_tbl WHERE name REGEXP 'mar' を SELECT します。
名前フィールド内で、母音文字で始まるか、文字列「ok」で終わるすべてのデータを検索します。 mysql> name を person_tbl から選択し、 name を正規表現で指定します '^[aeiou]|ok$';
MySQL 正規表現学習練習ノート REGEXP は、PHP の preg のように、MySQL で正規表現を実行するために使用される関数です。regexp 正規関数が単純なクエリである場合は、like を使用できますが、複雑な場合は、やはり regexp を使用する必要があります。見てみましょう。 MySQL ユーザー マニュアルでは、単純なクエリを作成するときにワイルドカードを使用することを推奨しています。 のように: Select [*|フィールド名リスト] From [テーブル名] where [フィールド名] like ["%someletter"|"%someletter%","_","?someletter"];
ただし、一部の特殊なクエリでは、正規表現は受け入れられません。 MYSQL では、次の 3 つの正規表現 WHERE 述語が提供されています。 正規表現、RLIKE、NOT RLIKE
これら 3 つを使用して、正規表現が続く元の LIKE 述語を置き換えます。 たとえば、フィールドに「_」を含むデータをクエリするには、次のクエリ ステートメントを使用します。 SELECT * FROM TABLENAME WHERE FIELDNAME RLIKE '.[_].';
拡張正規表現の文字には次のようなものがあります。 · '.' は任意の 1 文字に一致します。 · 文字クラス "[...]" は、角括弧内の任意の文字に一致します。たとえば、「[abc]」は「a」、「b」、または「c」に一致します。文字の範囲に名前を付けるには、「-」を使用します。 "[az]" は任意の文字に一致し、"[0-9]" は任意の数字に一致します。 · 「 * 」は、その前に続く文字の 0 個以上と一致します。たとえば、「x*」は任意の数の「x」文字に一致し、「[0-9]*」は任意の数の数字に一致し、「.*」は任意の数の任意の文字に一致します。 REGEXP パターンがテスト対象の値のどこかに一致する場合、パターンは一致します (これは、値全体が一致する場合にのみ一致する LIKE パターン マッチングとは異なります)。 テストする値の先頭または末尾に一致するようにパターンを配置するには、パターンの先頭に「^」を使用するか、パターンの末尾に「$」を使用します。 「b」で始まる名前を検索するには、「^」を使用して名前の先頭を一致させます。 正規表現を使用する SELECT * FROM pet WHERE name REGEXP BINARY '^b'; SELECT * FROM pet WHERE name REGEXP 'fy$'; SELECT * FROM pet WHERE name REGEXP 'w'; SELECT * FROM pet WHERE name REGEXP '^…..$'; SELECT * FROM pet WHERE name REGEXP '^.{5}$';
今日、アプリケーションでそのような問題に遭遇しました。 1,1,1,2,3,3,4,4,5,5,2,4,3,2,1,2のような値を持つフィールドt1があります。 たとえば、最初のカンマの前の数字が 3 ~ 5、3 番目のカンマの前の数字が 3 ~ 5、10 番目のカンマの前の数字が 3 ~ 5、残りが 1 ~ 5 であるような数字を検索する必要があります。 。 。 SQL ステートメントは次のように記述できます。 SELECT * FROM tb WHERE t1 REGEXP '^[3-5],[1-5],[3-5],[1-5],[1-5],[1-5],[1-5],[1-5],[1-5],[1-5],[3-5],[1-5],[1-5],[1-5],[1-5],[1-5],[1-5]%';
1. LIKE および NOT LIKE 比較演算子を使用します (= または != は使用できません)。 2. モードはデフォルトで大文字と小文字を区別しません。 3. 「_」が任意の 1 文字と一致し、「%」が任意の数の文字 (0 を含む) と一致します。 いくつかのmysqlの通常のルールを添付する ^は文字列の先頭に一致します $は文字列の末尾に一致します . は任意の文字(復帰改行を含む)に一致します。 a*は0個以上のa文字のシーケンスに一致します a+は1つ以上のa文字のシーケンスに一致します。 a? は0または1文字に一致する de|abcはシーケンスdeまたはabcに一致します (abc)*は、シーケンスadcの0回以上のインスタンスに一致します。
{n}、{m,n} {n} または {m,n} 表記は、パターンの先行する多くのアトム (または「部分」) を一致させることができる、より一般的な正規表現の記述方法を提供します。 m と n は両方とも整数です。 a*はa{0,}と書くことができる。 a+はa{1,}と書くことができる。 a?はa{0,1}と書くことができる
[a-dX] は、a、b、c、d、または X の任意の文字に一致します。他の 2 つの文字間の '-' 文字は範囲を形成します。 [^a-dX] は、a、b、c、d、X 以外の任意の文字に一致します。先行する文字 '^' は否定を意味します。
[.characters.] は、括弧式([ と ] を使用)内で、要素を照合するために使用される文字のシーケンスと一致します。文字は単一の文字または改行などの文字名です。 mysql> SELECT '~' 正規表現 '[[.~.]]'; -> 1 mysql> SELECT '~' REGEXP '[[.tilde.]]'; -> 1
[=キャラクタークラス=] 括弧式([ と ] を使用)内では、[=character_class=] は等価クラスを表します。それ自体を含む、同じ照合値を持つすべての文字と一致します。 [[=a=]]は[a(+)]、[a+]、[a{1,}]と同等である。
[:キャラクタークラス:] 括弧式([ と ] を使用)内では、[:character_class:] は用語クラスのすべての文字に一致する文字クラスを表します。 標準クラス名は次のとおりです。 alnum 英数字 アルファベット文字 空白 cntrl 制御文字 数字 グラフ グラフィック 文字 小文字のリテラル文字 グラフィックやスペース文字を印刷する 句読点文字 スペース スペース、タブ、改行、復帰 大文字のテキスト文字 xdigit 16進数の数字
[[:<:]]、[[:>:]] これらのマーカーは単語の境界を示します。それぞれ単語の先頭と末尾に一致します。単語とは、単語文字が前後に続かない単語文字のシーケンスです。文字は、クラス alnum の英数字またはアンダースコア (_) です。 mysql> select 'fang shan zi' regexp '[[:<:]]shan[[:>:]]'; -> 1 mysql> select 'fang shan zi' regexp '[[:<:]]fang[[:>:]]'; -> 1 mysql> select 'fang shans zi' regexp '[[:<:]]shan[[:>:]]'; -> 0
正規表現では、2 つのバックスラッシュ文字の後に続く特殊文字を使用します。 mysql> SELECT '1+2′ 正規表現 '1+2′; -> 0 mysql> SELECT '1+2′ 正規表現 '1+2′; -> 0 mysql> SELECT '1+2′ 正規表現 '1\+2′; -> 1
通常の正規表現を使用した MySQL 検索条件 私はMybatisを使用しています t.hobby : 条件フィールド 趣味: 検索パラメータ。値はカンマで区切られた複数の値にすることができます: '読書、友達作り、外出' <!-- t.hobby の値は、「食べる、飲む、売春する、ギャンブルする、喫煙する、不正行為をする、欺く、誘拐する、欺く、盗む」のいずれかです。各単語の両側には不規則なスペースがあります --> <!-- 以下にステップバイステップのデモンストレーションを示します --> <if test="趣味!=null and 趣味!=''"> concat(',',REPLACE (t.hobby, ' ', ''),',') 正規表現 concat(',(',replace(#{hobby},',','|'),'),') </if> <!-- テーブルフィールド t.hobby の値を抽出します --> <if test="趣味!=null and 趣味!=''"> concat(',',REPLACE (' 食べる、飲む、売春する、ギャンブルをする、喫煙する、騙す、欺く、誘拐する、盗む', ' ', ''),',') regexp concat(',(',replace(#{趣味},',','|'),'),') </if> <!-- テーブル フィールド値を処理した後、余分なスペースは削除されます --> <if test="趣味!=null and 趣味!=''"> concat(',','食べる、飲む、売春する、ギャンブルする、吸う、だます、だます、誘拐する、だます、盗む',',') regexp concat(',(',replace(#{趣味},',','|'),'),') </if> <!-- concat を実行すると、先頭と末尾にカンマが付いた文字列が得られます --> <if test="趣味!=null and 趣味!=''"> ',食べること、飲むこと、売春すること、ギャンブルすること、喫煙すること、不正行為をすること、騙すこと、誘拐すること、騙すこと、盗むこと、' regexp concat(',(',replace(#{趣味},',','|'),'),') </if> <!-- パラメータ #{hobby} の値を取得します --> <if test="趣味!=null and 趣味!=''"> '、食べること、飲むこと、売春すること、ギャンブルすること、喫煙すること、不正行為をすること、欺くこと、誘拐すること、不正行為をすること、盗むこと、' 正規表現 concat(',(',replace('食べること、飲むこと、売春すること、売春すること',',','|'),'),') </if> <!-- カンマを | に置き換えます --> <if test="趣味!=null and 趣味!=''"> '、食べる、飲む、売春婦、ギャンブル、喫煙、騙す、騙す、誘拐、騙す、盗む、' 正規表現連結 ('、('、'食べる|飲む|売春婦|売春婦'、'),') </if> <!-- concat を実行すると、先頭と末尾に括弧とカンマが付いた文字列が生成されます --> <if test="趣味!=null and 趣味!=''"> ',食べる,飲む,売春婦,ギャンブル,喫煙,騙す,騙す,騙す,盗む,' 正規表現 ',(食べる|飲む|売春婦|売春婦),' <!-- ギャンブルをしない Yu Qian 氏の美徳を偲んで--> </if>
結果は 1 なので、条件は真です。 複雑な手順は主に検索条件を処理するために使用されます。要件を満たす通常の状態を取得することは問題ありませんが、個人的にはより理想的な方法は次のとおりです。 検索されたフィールドは、データが最初に保存されたときにフォーマットされました: 「食べる、飲む、売春する、ギャンブルをする、喫煙する、騙す、欺く、誘拐する、奪う、盗む」 検索条件は次のように処理して渡すことができます: ',(eating|drinking|whoring|whoring),' 検索は次のように簡略化できます <if test="趣味!=null and 趣味!=''"> concat(',', t.hobby ,',') 正規表現 #{hobby} </if>
以上です。基本的には理解できると思います。それでも理解できない場合は、以下の関連記事を参照してください。 以下もご興味があるかもしれません:- 正規表現(RegExp)は、テキストボックスに特殊記号が含まれているかどうかを判定します。
- MySQL での正規表現置換のための replace と regexp の使用法の分析
- MySQL で REGEXP 正規表現を使用するための完全ガイド
- Oracle正規表現regexp_likeの使い方の詳細な説明
- js 正規表現の説明インデックス属性 (RegExp オブジェクト)
- js 正規表現 RegExp オブジェクト属性 lastIndex、lastMatch、lastParen、lastContext、rightContext 属性の説明
- ES9の新機能である正規表現RegExpの詳しい説明
|