【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
以上、何卒よろしくお願いいたします。
お礼
どうもありがとうございました。補足の部分はまた新たに投稿いたします。
補足
どうもありがとうございます。大変感謝です。replace(replaceに変えるのはきちんと理解がないとでてこないですね。 教えていただいたもので、思い通りになりましたが、もう1点問題がでました。年が変わったら「2015年」という名前でフォルダの作成を行いたいのですが、下記のコードでは「削除したい2015年」という名前のフォルダになってしまいます。フォルダの作成は、「削除したい」を除いたものを作成するにはどう変えればよいでしょうか? 理解がまだまだ薄いので、たびたびお手数をおかけしますがどうぞよろしくお願いいたします。 Sub ブックコピー自動翌月分作成() Dim i As Integer Dim wb As Workbook Dim myDir_path As String, myNew_path As String 'フォルダパスとファイルパスを作成 myDir_path = Left(ThisWorkbook.FullName, InStrRev(ThisWorkbook.FullName, "\") - 1) myNew_path = "削除したい" & Format(DateAdd("m", 1, Replace(Replace(ThisWorkbook.Name, "削除したい", ""), "月.xlsm", "")), "yyyy-m") & "月.xlsm" myDir_path = Left(myDir_path, InStrRev(myDir_path, "\")) & Left(myNew_path, 9) & "年\" 'フォルダの有無を確認、なければ作成 With CreateObject("Scripting.FileSystemObject") If Not .FolderExists(myDir_path) Then MkDir myDir_path 'MsgBox myDir_path & "を作成しました" 'MsgBox Left(myDir_path, InStrRev(myDir_path, "\")) & "に" & vbNewLine & MsgBox Left(ThisWorkbook.FullName, InStrRev(ThisWorkbook.FullName, "\") - 12) & "に" & vbNewLine & _ Left(myNew_path, 9) & "年" & "フォルダを新たに作成しました" End If End With 'ファイルの有無を確認、なければ保存,あれば処理中止 If Dir(myDir_path & myNew_path) = "" Then ThisWorkbook.SaveCopyAs myDir_path & myNew_path MsgBox myNew_path & "のファイルを新たに作成しました" Else MsgBox "翌月分のファイルはすでに存在するので処理を中止します", vbOKOnly, "処理中止" Exit Sub End If '新規作成したブックを開く,既に開いていれば処理中止 For Each wb In Workbooks If wb.Name = myNew_path Then MsgBox myNew_path & "は既に開いているので処理を中止します", vbOKOnly, "処理中止" Exit Sub End If Next Workbooks.Open myDir_path & myNew_path Workbooks(myNew_path).Activate End Sub