クイックスタート
チュートリアル
ツールと言語
リファレンス
書評
正規表現の例
数値範囲
浮動小数点数
メールアドレス
IPアドレス
有効な日付
数値日付をテキストに変換
クレジットカード番号
完全な行の一致
重複行の削除
プログラミング
2つの近接した単語
落とし穴
カタストロフィックバックトラッキング
過剰な繰り返し
サービス拒否
すべてをオプションにする
繰り返しキャプチャグループ
Unicodeと8ビットの混合
このサイトについて、さらに
はじめに
正規表現クイックスタート
正規表現チュートリアル
置換文字列チュートリアル
アプリケーションと言語
正規表現の例
正規表現リファレンス
置換文字列リファレンス
書評
印刷可能なPDF
このサイトについて
RSSフィードとブログ
RegexBuddy—The most comprehensive regular expression library!

数値日付をテキスト日付に置換する

この例では、1/1/50または01/01/50から12/31/49までの数値日付を、1950年1月1日から2049年12月31日までのテキスト表現に置き換える方法を示します。これは、一致したものに基づいて置換を変化させることができる場合のみ、単一の正規表現で可能です。これを行う1つの方法は、手続き型コードで各置換を構築することです。この例では、置換文字列の条件分岐を使用してこれを行う方法を示します。この例は、PowerGREP 5、Boost C++ライブラリ、およびPCRE2 Cライブラリで使用できます。

置換文字列の条件分岐を使用するには、正規表現で、異なる置換が必要な一致の各部分に対して個別のキャプチャグループが必要です。各月はそれぞれの名前で置換する必要があるため、各月の番号に一致する個別のキャプチャグループが必要です。1、2、3で終わる基数は、一意の接尾辞を持ちます。そのため、1、2、3、またはその他の数字で終わる日の番号に一致させるには、4つのグループが必要です。50から99までの年の番号は1950年から1999年まで、00から49までの年の番号は2000年から2049年までと仮定します。そのため、各半世紀に一致するグループをさらに2つ必要です。

正規表現

これらをすべてまとめると、かなり長い正規表現になります。フリースペースを使用すると、読みやすくなります。正規表現の構造は、有効な日付の一致で使用する場合と同じです。月の一致には12個の選択肢、日の一致には4個の選択肢、年の一致には2個の選択肢が必要なため、より冗長になっています。

\b
(?: # 月
   
(?'jan'0?1)|(?'feb'0?2)|(?'mar'0?3)|(?'apr'0?4)|(?'may'0?5)|(?'jun'0?6)
  
|(?'jul'0?7)|(?'aug'0?8)|(?'sep'0?9)|(?'oct'10)|(?'nov'11)|(?'dec'12)
  
) /
0?(?: # 日
   
(?'1st'[23]?1)|(?'2nd'2?2)|(?'3rd'2?3)|(?'nth'30|1[123]|[12]?[4-90])
  
) /
(?: # 年
   
(?'19xx'[5-9][0-9])|(?'20xx'[0-4][0-9])
  
)
\b

置換文字列

置換文字列では、バックリファレンスを使用して日付番号を再挿入します。先頭のゼロを置換から省略したいので、0?日付番号のキャプチャグループの外に配置しました。つまり、この正規表現は、10から31までの日の先頭にゼロがあっても許容します。目的が日付の検証ではなく置換であるため、これでも問題ありません。そうでなければ、月の日に一致させるために、1桁の日と2桁の日の2つのセットが必要になります。

残念ながら、フリースペースは置換文字列では機能しません。そのため、置換は非常に長い1行で構成されます。ページの幅に合わせて、ここでは複数の行に分割されています。これはBoost構文を使用した置換です。

(?{jan}January)(?{feb}February)(?{mar}March)(?{apr}April)(?{may}May)(?{jun}June)
(?{jul}July)(?{aug}August)(?{sep}September)(?{oct}October)(?{nov}November)
(?{dec}December) (?{1st}${1st}st)(?{2nd}${2nd}nd)(?{3rd}${3rd}rd)(?{nth}${nth}th)
(?{19xx}19${19xx})(?{20xx}20${20xx})

これはPCRE2構文を使用した置換です

${jan:+January}${feb:+February}${mar:+March}${apr:+April}${may:+May}${jun:+June}
${jul:+July}${aug:+August}${sep:+September}${oct:+October}${nov:+November}
${dec:+December} ${1st:+${1st}st}${2nd:+${2nd}nd}${3rd:+${3rd}rd}${nth:+${nth}th}
${19xx:+19${19xx}}${20xx:+20${20xx}}

まず、月の12個のキャプチャグループを参照する12個の条件分岐があります。各条件分岐は、そのグループが参加する場合に月の名前を挿入します。そのグループが参加しない場合は何も挿入しません。これらのグループのうち、いずれか1つだけが一致に参加するため、これらの条件分岐のうち実際に何かを挿入するのは1つだけです。

次に、リテラルスペースと、日の4つのキャプチャグループを参照するさらに4つの条件分岐があります。グループが参加すると、条件分岐は同じグループへのバックリファレンスを使用して、グループによって一致した日の番号を再挿入します。バックリファレンスには、リテラルサフィックスが続きます。

最後に、リテラルコンマ、リテラルスペース、年に関するさらに2つの条件分岐があります。条件分岐では、リテラルテキストとバックリファレンスを使用して、年を2桁から4桁に展開します。