QA@IT

Oracleの正規表現について

4456 PV

質問です。

Oracleで正規表現を利用してレコードを絞り込む方法についてです。

データベースに人名が登録されているのですが、その中で以下の種類以外の文字が入っているレコードを抽出しようとしています。
・全角数字
・アルファベット(全角大文字)
・全角カタカナ
・全角丸括弧
・全角スラッシュ
・全角スペース

そこで、以下のようなクエリを書いたのですが、全角カタカナ+全角スペースしか入っていないレコードが取れてしまいます。

select
  *
from
  tableA a
where
  REGEXP_LIKE(a.columnA ,'^[0-9A-Z¥ア¥イ¥ウ・・・(中略)・・・¥ワ¥ン¥(¥)¥/¥s ]')

どこが間違っているか、どう直せば良いか分かったら教えていただきたいです。

初歩的な質問で恐縮ですが、よろしくお願いします。

回答

一般的な正規表現の話としてレスします。Oracle は違うということであればハズレかもしれませんが、その場合はすみません。

以下の種類以外の文字が入っているレコードを抽出しようとしています。

以外ということでいいのですよね? 即ち、文字クラス(質問者さんが使っている角かっこ "[ ]" で囲むことで定義される正規表現内のミニ言語)内の文字を否定するということでいいのですよね?

その理解で合っているとして・・・

文字クラス内の文字を否定する場合、文字クラス内の最初の文字としてキャラット "^" を使用する必要があります。

質問者さんの場合、^[0-9A-Z・・・] と文字クラスの外になっており、この場合キャラット "^" は違う意味(文字列の先頭を指定する)のになります。[^0-9A-Z・・・] として試してみてください。

あと、照合順序がどうなっているのか、[^0-9A-Z¥ア¥イ¥ウ・・・] というのは質問者さんが望む結果を得るための正規表現のパターンとして正しいのかというのも疑問です。

それよりも何よりもまず第一に、質問者さんが言う、全角数字、アルファベット(全角大文字)、全角カタカナ、全角丸括弧、全角スラッシュ、全角スペースの定義を明確にする必要があります。

例えば、全角数字、アルファベット(全角大文字) は以下(Windows 10 付属の IME パッドを見ています)で良いのか、違うのか、これ以外にもあるのかが分からないと正規表現パターンは書けません。

ime.jpg

そのあたりが明確になってから、照合順序と正規表現パターンの話をした方がよさそうです。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。