ISO 8601 覚書と正規表現

ISO 8601 覚書と正規表現

日付の表現

  • 暦日付、年間通算日、週間日付の3種類だが、年間通算日と週間日付は除外する
暦日付
  • 書式は YYYY-MM-DD または YYYYMMDDを許容する
  • YYYYは4桁(0000-9999)、MMは2桁(01-12)、DDは2桁(01-31)とする
  • 下位省略表記については、YYYY-MM、YYYY を採用する
let REG_YYYYMMDD = /^([0-9]{4})(?:\-?(0[1-9]|1[0-2])(?:\-?(0[1-9]|[12][0-9]|3[01]))?)?$/;
  • 上位省略表記については、--MM-DD、--MM、---DDを許容する
let REG_YYYYMMDD = /^(?=(?:\d+(?:\-\d+(?:\-\d+)?)?|\-\-\d+?\-?\d+))([0-9]{4})?\D*(0[1-9]|1[0-2])?\D?(0[1-9]|[12][0-9]|3[01])?$/;
正規表現での考え方

前段階で2つの書式をチェックして、後半で数字をチェックする。
reg_exp.exec (string) => Array (4) [*****, YYYY, MM, DD]

更に拡張して元号年月日を許容する

  • 文字列の先頭 "西暦|明治|大正|昭和|平成|令和|M|T|S|H|R" を識別する。西暦年は4桁、他の元号は2桁を許容する
  • 明治初期は陰暦なのでその年代の使用には注意を要する。
  • 漢字交じりの日付文字列に限り数値の前後の空白を許容する。
  • 元号年は2桁の、"明治99年1月1日"を許容する。
  • 上位省略表記については除外する
let REG_GYYYYMMDD = /^(?=(?:(?:[MmTtSsHhRr]?\d{1,2}|\d{4})(?:\-?\d+(?:\-?\d+)?)?|\s*(?:西暦\s*\d{4}|(?:明治|大正|昭和|平成|令和)\s*\d{1,2})\s*年\s*(?:\d+\s*月\s*(?:\d+\s*日\s*)?)?))\s*([^\d\s]+)?\s*([0-9]{1,4})\D*\s*(0?[1-9]|1[0-2])\D*\s*(0?[1-9]|[12][0-9]|3[01])\D*\s*$/;

console.log (REG_GYYYYMMDD.exec ("西暦 2021 年 3 月 1 日"));
//=> Array(5) ["西暦 2021 年 3 月 1 日", "西暦", "2021", "3", "1" ]

時刻の表現

  • 書式は HH:MM:SS、HHMMSS、HH:MM、HHMM、-MM:SS、-MMSS、--SS を許容する