Name
フィールドに特殊文字 (アンダースコアを除く) が含まれているテーブルの行のみを返す SQL ステートメントを探しています。
私はもう試した:
SELECT * FROM 'table' WHERE Name REGEXP '^[!#$%&()*+,\-./:;<=>?@[\\\]^`{|}~]+$'
しかし、サイコロはありません。これは空の結果セットを返します (%, $, and #
文字を含む名前フィールドで特別に追加した行があるにもかかわらず)。
最初の問題は^
and$
記号のようです (Mike C は、なぜ私よりも早くそれを要約しました...)
しかし、エスケープの問題も見られます。正規表現で何かを意味するすべての特殊文字は、逃げた特別に配置されている[]
ので[
、、、]
^
-
これは、 MySQL 正規表現の文字グループ内の特殊文字をエスケープする方法に関する質問です。
正規表現のドキュメントに詳述されている結論:
ブラケット式は、'[]' で囲まれた文字のリストです。通常、リストの任意の 1 文字に一致します (ただし、以下を参照してください)。
リストが '^' で始まる場合、リストの残りの文字ではなく、任意の 1 文字 (ただし以下を参照) に一致します。
リスト内の 2 つの文字が「-」で区切られている場合、これは、照合順序におけるこれら 2 つの文字の間の全範囲 (両端を含む) の短縮形です。たとえば、ASCII の「[0-9]」は、任意の 10 進数に一致します。
'ace' のように、2 つの範囲がエンドポイントを共有することは違法です (!)。範囲は照合順序に大きく依存するため、移植可能なプログラムは範囲に依存することを避ける必要があります。
リストにリテラル ']' を含めるには、それを最初の文字にします (可能性のある '^' に続きます)。
リテラル「-」を含めるには、それを最初または最後の文字にするか、範囲の 2 番目のエンドポイントにします。
リテラル「-」を範囲の最初のエンドポイントとして使用するには、それを「[.」で囲みます。および '.]' を使用して照合要素にします (以下を参照)。
これらと「[」を使用したいくつかの組み合わせ (次の段落を参照) を除いて、「\」を含む他のすべての特殊文字は、ブラケット式内での特別な意味を失います。
EDIT
これは、文字に関するいくつかの興味深い正規表現に関するSQLフィドルです]
DDL: テーブル txt を作成します ( txt varchar(200) );
insert into txt values ('ab[]cde');
insert into txt values ('ab[cde');
insert into txt values ('ab]cde');
insert into txt values ('ab[]]]]cde');
insert into txt values ('ab[[[[]cde');
insert into txt values ('ab\\]]]]cde');
insert into txt values ('ab[wut?wut?]cde');
クエリ:
[
および]
charsのグループに一致する単純なアプローチ。構文的にはOKですが、グループは単一の文字であり、その後[
複数の文字に一致します.]
SELECT * FROM txt WHERE txt
REGEXP 'ab[[]]+cde';
エスケープ -> 同じ ???
SELECT * FROM txt WHERE txt
REGEXP 'ab[[\]]+cde';
ダブルエスケープ -> 機能しません。グループは a[
と aになりました\
SELECT * FROM txt WHERE txt
REGEXP 'ab[[\\]]+cde';
グループ内の閉じ括弧を開き括弧と交換します。これは私が今まで書いた中で最も奇妙な正規表現です - この時点まで...
SELECT * FROM txt WHERE txt
REGEXP 'ab[][]+cde';
私は奇妙な悪夢の中でそのような(完全に有効な!)正規表現によって殺されるでしょう、私は思います:
SELECT * FROM txt WHERE txt
REGEXP 'ab[]wut?[]+cde';
この正規表現は、特殊文字のみを含む名前と一致する必要があります。文字列の開始を示すカラット (^)、特殊文字のリストを含む文字クラス、1 つ以上を示すプラス記号 (+)、文字列の終了を示すドルを指定します。文字列内の非特殊文字を考慮する必要があります。次のようなことを試すことができます:
WHERE Name REGEXP '^.*?[!#$%&()*+,\-./:;<=>?@[\\\]^`{|}~]+.*?$'
.*? を追加しました。特殊文字の前後に非特殊文字を許可するために、最初と最後に。ところで、おそらく (+) はもう必要ありません。なぜなら、マッチには 1 つのスペシャルで十分だからです。