• ベストアンサー
  • すぐに回答を!

【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]|1[012])(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 以上、何卒よろしくお願いいたします。

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数11246
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.1

クエリで正規表現は使えません。 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 と変換します。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

早速のご回答ありがとうございました。 詳しいご説明に加え、回答も示していただき大変感謝しております。 ネット上にaccessクエリの正規表現の情報が見当たらなかったため、 だいぶハマっておりました。そもそも使えないのですね。 御掲示いただいたクエリを実行したところ(6)以外が網羅されており、 かなり驚きました。ありがとうございます。 また、以外とシンプルな点も分かりやすくて嬉しかったです。 理解が深まり勉強になりました。 なお、(6)をカバーするため、最終的には下記のように加筆致しました。 SELECT IIf( IsDate( Format( a.date, IIf(a.date Like "########","0000/00/00","") ) ) , Format( a.date,IIf(a.date Like "########","0000/00/00", "") ), IIf( IsDate( IIf(a.date Like "####年#月##", a.date & "日","") ) , CDate(Format(Replace(Replace(a.date, '年', '0'), '月', ''),"@@@@/@@/@@")) ,"")) FROM a; おかげ様で無事解決することができました。 本当にありがとうございました。

関連するQ&A

  • 【ACCESS】クエリで正規表現の論理和について

    いつもお世話になります。 ACCESSのクエリで下記の2つの文字列にマッチする正規表現は どのように書けばよいのでしょうか。 ・20110101 ・20111231 下記の通り書いてみましたが、うまくいきませんでした。 どうやら、論理和「|」やグループの括弧「()」を記述するとNGみたいなのですが。。 使えないのでしょうか。 SELECT IIf (a.date Like '[1-9][0-9][0-9][0-9] (0[1-9] | 1[012] )', a.date, '') FROM a; 上記クエリでは、テーブルaからdate列(文字列)を抽出する際、 パターンにマッチすればその値を返し、マッチしなければ空白を返させようとしました。 結果は空白が返ってしまいました。 何かお気づきの点があれば、教えていただきたく存じます。 以上、よろしくお願いします。

  • Access2000にてお寺の管理dbを作っています。御法事の回忌を抽

    Access2000にてお寺の管理dbを作っています。御法事の回忌を抽出したくテーブルに没年月日、回忌のフィールドを作りクエリの回忌のフィールドに回忌:IIF(Format([没年月日],"mm/dd")>Format(Date(),"mm/dd"),DateDiff("yyyy",[没年月日],Date())-1,DateDiff("yyyy",[没年月日],Date()))と回答をいただき 回忌:IIF(Format([没年月日],"mm/dd")<Format(Date(),"mm/dd"),DateDiff("yyyy",[没年月日],Date())+1,DateDiff("yyyy",[没年月日],Date())) >を< -1を+1 にしてできたのですが。 Date()ですと今年の御命日が来るまでは50回忌のひとでも49回忌になってしまいます。 御命日が来なくても(御法事の申し込みは命日の数日、数か月前が多いので)今年の回忌を出させるにはどうしたらいいのでしょうか?

  • ACCESS フォームで入力した日付をクエリで読み

    ACCESS フォームで入力した日付をクエリで読み替えたい ACCESS フォームで入力した日付をクエリで使用しているテーブルの書式に変換したい フォーム テキスト名:日付にyyyymmdd で入力します クエリ テキスト名:日付はパラメータとして使用しています クエリ内で使用しているテーブルの日付書式は 日付:yyyy/mm/ddです パラメータは 「日付始」と「日付終」の2箇所のテキストに入力されたデータを使用しています。以下がパラメータです。 Between [Forms]![フォーム]![日付始] and [Forms]![フォーム]![日付終] フォームのテキストボックスにyyyymmddと入力してもクエリでエラーが出ることない パラメータを日付に設定したいのですがどうしたらよいでしょうか? ちなみに、以下の式を入れたらエラーです。 Between CDate(Format([Forms]![フォーム]![日付始],"yyyy/mm/dd")) and CDate(Format([Forms]![フォーム]![日付始],"yyyy/mm/dd")) と入力しましたところ、、、、「式が複雑すぎるか、、、」のエラーメッセージが出てしまいました。 どなたか助けてください。お願い致します。

  • 正規表現の書き方教えてください(PHP)

    PHPで、以下の例のように、日付の文字列から年/月/日の数字部分をそれぞれ、<span>で囲みたいです。 正規表現の置き換えで出来ると思うのですが、正規表現が苦手なため苦戦しております。 どなたかアドバイスいただけると助かります。 (例) 2011年5月12日(木)~6月1日(水) ↓ [A] <span class="y">2011</span>年 <span class="m">5</span>月 <span class="d">12</span>日(木)~ <span class="m">6</span>月 <span class="d">1</span>日(水) もしくは [B] <span class="y">2011</span>年 <span class="md">5</span>月 <span class="md">12</span>日(木)~ <span class="md">6</span>月 <span class="md">1</span>日(水) [A]と[B]で、速度がそれほど変わらなければ[A]のようにしたいです。 年と月は入ったり入らなかったりします。 月と日はゼロ埋めなしの1~2桁、年は必ず4桁です。 PHPのバージョンは5.2.5です。

    • ベストアンサー
    • PHP
  • string formatについて

    フォームの値(年、月、日)を取得し、 yyyy/mm/ddのようにformatしたいのですが、 以下の場合ですと、年2007 月07 日11 としていると、 例外が発生してしまいます。(java.util.FormatFlagsConversionMismatchException) 元々4桁,2桁あるものに関しては0埋めできないのでしょうか? ご教示願います。 (String.format("%04s/%02s/%02s", form.getStart_date_y(), form.getStart_date_m(), form.getStart_date_d()));

    • ベストアンサー
    • Java
  • Access2007で同月同日を抽出

    ある(*.accdb)のクエリーで日付の所に Like"*/"&Format(date(),"mm/dd") と書いて本日と同じ同月同日を抽出していますが本日ではなく任意の yyyy/mm/ddをあるレコード欄に入力したらその日付の同月同日を抽出するにはクエリーにどの様に書けばよいのか教えてください。

  • Accessで日付を抽出するパラメータを設定したい

    Accessのクエリで日付に対して与えているパラメータがあります。 パラメータで指定したいデータはフォームのテキストに入力した日の23:59:59 以降の日付を抽出したい。 入力:数値8桁(yyyymmdd)で行う 抽出先テーブルのデータ:yyyy/mm/dd hh:mm:ss 現在以下のパラメータを日付に対して与えると「式が複雑すぎます、、、」と注意されてしまいます。 指定日の23:59:59を抽出範囲として指定するのはどうしたらよいでしょうか? 入力値の変換も含めて、以下のパラメータを入れています。 「+"23:59:59"」をとればエラーは出ません。 <=IIF(Len([Forms]![フォーム名]![日付])=8,CDate(Format([Forms]![フォーム名]![日付],"@@@@/@@/@@")),#9999/1/01#)+"23:59:59" どなたか、お助け下さい。よろしくお願い致します。

  • Access2000にてお寺の管理dbを作っています。御法事の回忌を抽

    Access2000にてお寺の管理dbを作っています。御法事の回忌を抽出したくテーブルに没年月日、回忌のフィールドを作りクエリの回忌のフィールドに回忌:IIF(Format([没年月日],"mm/dd")>Format(Date(),"mm/dd"),DateDiff("yyyy",[没年月日],Date())-1,DateDiff("yyyy",[没年月日],Date()))としたのですがコーテーションエラーになってしまいます。 どのようにしたらいいのでしょうか? 回忌ですから亡くなった翌年が1周忌2年目が3回忌になります。

  • Access 抽出条件 フォームの作成について

    クエリで以下のような関数で日数から期首を求めたのですが 抽出条件の指定が出来ません。テキスト型、○○年○○月、期首7月 今期: IIf(Month(CDate([決算日] & "01日"))<=7,Format(DateAdd("m",-6,CDate([決算日] & "01日")),"ggge" & "年"),Format(CDate([決算日] & "01日"),"gggee" & "年")) 色々試してみましたがデータ型が違うといわれるのですが、どの様な方法をとれば良いでしょうか? それとエラーになっている(日付けデータが無い)部分はほって置いて良いのでしょうか?

  • ACCESSのDate関数について

    会社のDBにACCESSで繋いで必要な資料を作成しています。そのDBの日付の書式がyyyymmddの型になっていて、クエリの抽出条件でdate()と入力しても上手くいきません。そのために、left(date,4)&"/"&mid(date,5,2)&"/"&right(date,2)としてyyyy/mm/ddの型に直して抽出しています。このやり方だとクエリの実行にとても時間がかかります。yyyymmddのままでパラメータを指定して20070630と入力すると10秒かからずに表示されますが、yyyy/mm/ddの型に直してdate()にすると3分近くかかります。yyyymmddのままでdate()を使う方法はありますか?