正規表現
シリーズ【正規表現】──年月日をまとめて検索する
前回の記事「シリーズ【正規表現】──AI時代でも廃れない知識」では、正規表現とは「文字のパターンを指定して検索する仕組み」であることをご紹介しました。
今回は、そこからほんの少しだけ進んでみます。
例えば、文書の中に次のような日付があるとします。
年も月も日もバラバラです。
普通に検索するなら、それぞれの日付を一つずつ検索する必要があります。
しかし正規表現を使えば、これらを一つの式ですべてまとめて検索できます。
今回は、完成した正規表現をいきなり覚えるのではなく、前回覚えた表現を使いながら、一つずつ組み立ててみましょう。
まずは「年」だけを探してみる
前回、4桁の数字の後ろに「年」が付いた文字列を検索する式をご紹介しました。
\d{4}年
でした。
分解すると、
- \d = 数字1文字
- {4} = 直前の表現をちょうど4回
年= 文字「年」
です。
この式で先ほどの例を検索すると、次の部分が見つかります。
ここまでは前回のおさらいです。
では、この後ろに「月」も追加してみましょう。
「月」を追加する
月は、
9月
のように数字が1桁の場合もあれば、
12月
のように2桁の場合もあります。
前回、数字が1文字以上続く部分は、
\d+
と書けることを紹介しました。
そこで、先ほどの式の後ろにそのまま追加してみます。
\d{4}年\d+月
すると、先ほどより少し長い範囲が検索されます。
少しずつ日付らしくなってきました。
今度は「日」も追加する
日も月と同じように、
1日
のように1桁の場合も、
31日
のように2桁の場合もあります。
そこで、同じように \d+ を追加します。
\d{4}年\d+月\d+日
これで、日付全体をまとめて検索できるようになりました。
実は、これでも今回の目的は達成できています。
ここは正規表現を使う上で大切なポイントです。
正規表現には、ある検索条件に対して「唯一の正解」があるとは限りません。
今回の日付を検索するという目的であれば、
\d{4}年\d+月\d+日
も立派な正解です。
同じ文字列を検索するために、異なる正規表現を作れることは珍しくありません。
その中には、より対象を限定した式もあれば、広めに検索する式もあります。短く書けるものもあれば、少し長くても意図がわかりやすいものもあります。
重要なのは、どの式が唯一正しいかを探すことではなく、自分が探したい文字のパターンを表現できているかです。
そのうえで今回は、もう一歩進んで、月と日の部分を少し具体的に表してみましょう。
月と日の「桁数」をもう少し正確に表す
日付の表記には、
2026年9月1日2026年09月01日2025年12月31日
のように、月や日を1桁で書く場合と2桁で書く場合があります。
つまり、今回探したい文字列をもう少し具体的に表現するなら、
「月と日は1桁または2桁の数字」
となります。
ここで、
\d{2}
としてしまうと、2桁の数字だけが対象になるため、
09月01日
は検索できますが、
9月1日
は検索できません。
そこで使えるのが、
{1,2}
です。
{1,2}──1回以上2回以下の繰り返し
前回、
{4}
は「直前の文字や表現をちょうど4回繰り返す」という意味だと説明しました。
同じように、
{1,2}
と書けば、
「直前の文字や表現を1回以上2回以下繰り返す」
という意味になります。
したがって、
\d{1,2}
なら、
「数字が1文字または2文字」
となります。
これを月と日の部分に使えば、
\d{4}年\d{1,2}月\d{1,2}日
となります。
式を分解すると、次のようになります。
| 表現 | 意味 |
|---|---|
| \d{4} | 4桁の数字 |
年 | 文字「年」 |
| \d{1,2} | 1桁または2桁の数字 |
月 | 文字「月」 |
| \d{1,2} | 1桁または2桁の数字 |
日 | 文字「日」 |
つまり、
「4桁の数字+年+1~2桁の数字+月+1~2桁の数字+日」
というパターンを検索しているわけです。
図1 探したい日付の各部分と、\d{4}年\d{1,2}月\d{1,2}日 の各部品との対応関係
これなら、月や日が1桁でも2桁でも、一つの正規表現でまとめて検索できます。
ここで改めて比べてみましょう。
\d{4}年\d+月\d+日
でも、今回例に挙げた日付は検索できます。
\d{4}年\d{1,2}月\d{1,2}日
では、さらに「月と日は1~2桁」という条件まで式の中に表しています。
どちらか一方が正解で、もう一方が間違いというわけではありません。
どこまで条件を具体的に書くかは、検索したいデータや目的によって変わります。
正規表現では、このように、まず目的を満たす式を作り、必要であればそこから条件を追加したり、逆に簡単な式にしたりすることができます。
ただし、「正しい日付」とは限らない
ここで一つ注意点があります。
今回作った、
\d{4}年\d{1,2}月\d{1,2}日
という正規表現は、
2026年99月99日
にも一致します。
99月も99日も実際には存在しません。
なぜこのようなことが起こるのでしょうか。
正規表現が見ているのは、あくまで文字のパターンだからです。
今回の式は、
4桁の数字の後ろに「年」があり、その後ろに1~2桁の数字と「月」、さらに1~2桁の数字と「日」がある
という条件を指定しているだけです。
その数字がカレンダー上、本当に存在する日付なのかまでは判断していません。
正規表現は「日付を理解している」のではなく、日付らしい文字の並びを探しているわけです。
もっと条件を追加して検索対象を絞ることもできますが、式はその分複雑になります。
翻訳やQAの作業では、まず候補をまとめて検索し、その結果を確認するだけで十分なことも少なくありません。
必要以上に複雑な式を作るのではなく、何を探したいのかに応じて必要なところまで絞るという考え方も大切です。
実務では何が便利なのか
今回の式は非常に単純ですが、大量の文字を扱う作業では意外に便利です。
例えば、長い文書の中にある日付を確認したいとき、
\d{4}年\d{1,2}月\d{1,2}日
と検索すれば、一つひとつ日付を指定する必要はありません。
正規表現に対応した検索やフィルターを使えば、文書中の日付をまとめて探し、表記が統一されているか確認したり、翻訳時のチェック対象を絞り込んだりできます。
memoQでも、検索・置換や翻訳エディターのフィルターなどで正規表現を利用できます。
こうしたところが、正規表現と翻訳・QA作業との相性がよい理由の一つです。
今回も、式を暗記する必要はありません
今回最後に作った、
\d{4}年\d{1,2}月\d{1,2}日
だけを見ると、最初は少し複雑に見えるかもしれません。
しかし、今回やったことを振り返ると、
まず、
\d{4}年
から始め、
月を追加して、
\d{4}年\d+月
さらに日を追加して、
\d{4}年\d+月\d+日
としました。
この時点ですでに、今回探したい日付は検索できます。
そこからさらに、月と日を1~2桁として表すため、
\d{4}年\d{1,2}月\d{1,2}日
という別の式を作りました。
一つずつ見れば、それほど難しいことはしていません。
そして、この2つの式のどちらかを「正解」として覚える必要もありません。
正規表現では、同じ目的に対して複数の式を作れることがあります。
ある場面では短く単純な式で十分かもしれませんし、別の場面では条件を細かく指定した方が便利かもしれません。
正規表現を使う上で大切なのは、複雑な式を丸暗記することではなく、探したい文字列を小さな部品に分け、自分の目的に合った検索パターンを組み立てられることです。
次回予告
今回は、異なる年月日を一つの正規表現でまとめて検索できるようになりました。
次は、「検索」からもう一歩進んで「置換」をやってみます。
例えば、
2026年9月1日
を、
9/1/2026
のような米国式の日付や、
1/9/2026
のような日・月・年の形式に変換してみます。
そのためには、検索した文字列の中から「年」「月」「日」をそれぞれ覚えておき、置換するときに好きな順序で取り出す必要があります。
次回は、その仕組みを使って、今回検索した日付を実際に並べ替えてみます。