例 |
正規表現の例 |
数値範囲 |
浮動小数点数 |
メールアドレス |
IPアドレス |
有効な日付 |
数値日付をテキストに変換 |
クレジットカード番号 |
完全な行の一致 |
重複行の削除 |
プログラミング |
2つの近接した単語 |
落とし穴 |
カタストロフィックバックトラッキング |
過剰な繰り返し |
サービス拒否 |
すべてをオプションにする |
繰り返しキャプチャグループ |
Unicodeと8ビットの混合 |
このサイトについて、さらに |
はじめに |
正規表現クイックスタート |
正規表現チュートリアル |
置換文字列チュートリアル |
アプリケーションと言語 |
正規表現の例 |
正規表現リファレンス |
置換文字列リファレンス |
書評 |
印刷可能なPDF |
このサイトについて |
RSSフィードとブログ |
この例では、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桁に展開します。
| クイックスタート | チュートリアル | ツールと言語 | 例 | リファレンス | 書評 |
| 正規表現の例 | 数値範囲 | 浮動小数点数 | メールアドレス | IPアドレス | 有効な日付 | 数値日付をテキストに変換 | クレジットカード番号 | 完全な行の一致 | 重複行の削除 | プログラミング | 2つの近接した単語 |
| カタストロフィックバックトラッキング | 過剰な繰り返し | サービス拒否 | すべてをオプションにする | 繰り返しキャプチャグループ | Unicodeと8ビットの混合 |
ページURL: https://regular-expressions.dokyumento.jp/datestotext.html
最終更新日: 2020年4月8日
サイト最終更新日: 2024年3月15日
Copyright © 2003-2024 Jan Goyvaerts. All rights reserved.