質問: 【access】クエリによる正規表現の基本的書き方 いつもお世話になっております。 accessのクエリで、下記8パターンにマッチする文字列を yyyymmddの形で抽出する方法が判りません。 例でも構わないので、ご教示いただけないでしょうか。 (1)yyyymmdd (数字は半角) (2)yyyy年m月dd日 (数字は半角) (3)yyyy年mm月dd日 (数字は全角) (4)yyyy年m月dd日 (数字は全角) (5)yyyy年mm月dd日 (数字は半角) (6)yyyy年m月dd (数字は半角) (7)yyyy/mm/dd (数字は全角) (8)yyyy/mm/dd (数字は半角) ※12月32日等の日付不正は対象外 数字の全・半角は区別しなくても抽出可能と考えています。 ただ、そもそも、正規表現の基本的な書き方が判らず。。 グループ化させるための括弧「()」や、論理和の「|」を使うと 抽出できませんでした。 accessでは利用不可なのでしょうか。。 一応、私の作成したクエリを掲載致します。 テーブルaからdate列を抽出します。上記8パターンにマッチする場合は、yyyymmdd形式で、いずれにもマッチしなければ空白を返させたいと思います。 select iif (a.date like '1-9][0-9][0-9][0-9(0[1-9]|[12][0-9]|3[01])', a.date, iif (a.date like '[1-9][0-9][0-9][0-9]年[1-9]月(0[1-9]|[12][0-9]|3[01])日', format(cdate(format(replace(replace(replace(a.date, '年', ''), '月', ''), '日', ''), "@@@@/@@/@@")), "yyyymmdd"), iif (a.date like '[1-9][0-9][0-9][0-9]年(0[1-9]|1[012])月(0[1-9]|[12][0-9]|3[01])日', format(cdate(format(replace(replace(replace(a.date, '年', ''), '月', ''), '日', ''), "@@@@/@@/@@")), "yyyymmdd"), iif (a.date like '[1-9][0-9][0-9][0-9]年[1-9]月(0[1-9]|[12][0-9]|3[01])日', format(cdate(format(replace(replace(replace(a.date, '年', ''), '月', ''), '日', ''), "@@@@/@@/@@")), "yyyymmdd"), iif (a.date like '[1-9][0-9][0-9][0-9]年(0[1-9]|1[012])月(0[1-9]|[12][0-9]|3[01])日', format(cdate(format(replace(replace(replace(a.date, '年', ''), '月', ''), '日', ''), "@@@@/@@/@@")), "yyyymmdd"), iif (a.date like '[1-9][0-9][0-9][0-9]年[1-9]月(0[1-9]|[12][0-9]|3[01])', format(cdate(format(replace(replace(a.date, '年', ''), '月', ''), "@@@@/@@/@@")), "yyyymmdd"), iif (a.date like '[1-9][0-9][0-9][0-9]/(0[1-9]|1[012])/(0[1-9]|[12][0-9]|3[01])', format(cdate(format(replace(replace(a.date, '/', ''), '/', ''), "@@@@/@@/@@")), "yyyymmdd"), iif (a.date like '[1-9][0-9][0-9][0-9]/(0[1-9]|1[012])/(0[1-9]|[12][0-9]|3[01])', format(cdate(format(replace(replace(a.date, '/', ''), '/', ''), "@@@@/@@/@@")), "yyyymmdd"), '' ) ) ) ) ) ) ) ) from a 以上、何卒よろしくお願いいたします。
回答: クエリで正規表現は使えません。 like演算子で、ある程度のワイルド文字は使えますが。 > (1)yyyymmdd (数字は半角) > (2)yyyy年m月dd日 (数字は半角) > (3)yyyy年mm月dd日 (数字は全角) > (4)yyyy年m月dd日 (数字は全角) > (5)yyyy年mm月dd日 (数字は半角) > (6)yyyy年m月dd (数字は半角) > (7)yyyy/mm/dd (数字は全角) > (8)yyyy/mm/dd (数字は半角) > ※12月32日等の日付不正は対象外 (1) 以外は、isdate関数でチェックできます。 (1)もyyyy/mm/ddに変換してからisdateでチェックできます。 これを使えば比較的シンプルな式でチェックできます。 > テーブルaからdate列を抽出します。上記8パターンにマッチする場合は、yyyymmdd形式で、いずれにもマッチしなければ空白を返させたいと思います。 select iif(isdate(format(a.date,iif(adate like "########","0000/00/00",""))), format(a.date,iif(adate like "########","0000/00/00","")) ,"") from a; ただし、8パターン以外でも和暦表現や空白を含むものでも日付と判断できるものは変換します。 h23/09/01 平成23年9月1日 なども 20110901 と変換します。