正規表現
シリーズ【正規表現】──検索した文字を並べ替えて置換する
前回の記事「シリーズ【正規表現】──年月日をまとめて検索する」では、次の正規表現を作りました。
\d{4}年\d{1,2}月\d{1,2}日
これを使えば、
のような異なる日付を、一つの式でまとめて検索できます。
今回は、その先に進んでみましょう。
例えば、
のように変更したいとします。
単に「検索した日付を別の文字に置き換える」だけなら、それほど難しくありません。しかし今回は、検索した日付の中にある年・月・日をそのまま残しながら、順番だけを入れ替えたいわけです。
そこで使うのが、(\d{4}) や (\d{1,2}) のように、後から使いたい正規表現の部分を括弧で囲む方法と、$1、$2、$3 です。
見慣れない記号が一気に増えましたが、仕組み自体はそれほど難しくありません。今回は、「箱に入れて、あとで取り出す」と考えてみましょう。
まず、残しておきたい部分を括弧で囲む
前回作った正規表現は、
\d{4}年\d{1,2}月\d{1,2}日
でした。
ここで、後から使いたいのは、
- 年の直前の4桁の数字
- 月の直前の1~2桁の数字
- 日の直前の1~2桁の数字
の3つです。
そこで、それぞれの正規表現を括弧で囲んでみます。
(\d{4})年(\d{1,2})月(\d{1,2})日
前回の式に、新しく3組の括弧を追加しただけです。
(\d{4}) のように正規表現の一部を括弧で囲むと、その部分に一致した文字をあとで利用できるようになります。
例えば、
これらを、一時的に3つの「箱」に入れておくと考えてみましょう。

括弧で囲んだ部分を $1・$2・$3 として保存し、置換時に並べ替えるイメージ
正規表現では、括弧で囲んだ部分に、左から順番に1、2、3……と番号が付きます。
つまり、
(\d{4})年(\d{1,2})月(\d{1,2})日
では、次のようになります。
| グループ | 中身 | 2026年9月1日の場合 |
|---|---|---|
| $1 | 年の前の4桁の数字 | 2026 |
| $2 | 月の前の1~2桁の数字 | 9 |
| $3 | 日の前の1~2桁の数字 | 1 |
このように、括弧で囲んで覚えておく部分を、正規表現ではキャプチャグループと呼びます。
検索したい正規表現を括弧で囲み、その部分に一致した文字を番号の付いた箱に入れておく
箱に入れたものを $1、$2、$3 で取り出す
さて、年・月・日をそれぞれの箱に入れました。次は、それを取り出します。
今回作りたいのは、9/1/2026 です。つまり、月 → 日 → 年 の順番に並べたいわけです。
- 月は箱 $2
- 日は箱 $3
- 年は箱 $1
そこで、置換する文字列を、
$2/$3/$1
とします。
の順番で取り出され、9/1/2026 となります。
補足:$1 の書き方はツールによって異なります
キャプチャした内容を置換時に呼び出す書き方は、使用するツールや正規表現エンジンによって異なります。この記事ではmemoQで使用されている形式に合わせて $1、$2、$3 と表記していますが、ツールによっては \1、\2、\3 などを使用する場合もあります。
なお、環境やフォントによっては、バックスラッシュ \ が半角の円記号 ¥ のように表示されることがあります。
並べ方を変えれば、別の形式にもできる
面白いのは、同じ検索式を使ったまま、置換側だけを変えられることです。
検索式は、
(\d{4})年(\d{1,2})月(\d{1,2})日
のままです。
$3/$2/$1 とすれば 1/9/2026 に、$1-$2-$3 とすれば 2026-9-1 になります。
最初に括弧で囲んで覚えておいた3つの文字列を、どの順番で、どんな文字と組み合わせて取り出すかを指定しているだけです。
「年」「月」「日」はどこへ行った?
ここでもう一度、検索式を見てみましょう。
(\d{4})年(\d{1,2})月(\d{1,2})日
年、月、日 は括弧で囲まれていません。そのため、この3文字は検索には使われますが、箱には入りません。
一方、括弧で囲まれた各部分は、検索した後でも $1、$2、$3 として利用できます。
検索には必要だけれど、置換後には残したくない文字
と
検索して、置換後にも使いたい文字
を分けることができます。
$1 に入る文字は毎回変わる
$1 に常に 2026 が入るわけではありません。
2025年12月31日 であれば、$1 → 2025、$2 → 12、$3 → 31 となります。
1999年1月10日 なら、$1 → 1999、$2 → 1、$3 → 10 です。
$1、$2、$3 は、特定の数字そのものを意味しているわけではありません。そのとき検索された文字列を一時的に入れておく箱を参照していると考えると分かりやすいでしょう。
プログラミングをしたことがある方なら、「変数」に少し近い感覚だと考えてもよいかもしれません。
置換は「文字を理解して変換」しているわけではない
例えば、2026年09月01日 を $2/$3/$1 で置換すると、09/01/2026 になります。9/1/2026 にはなりません。
これは、箱 $2 には 09、箱 $3 には 01 が入っているからです。
正規表現が数字を計算したり、「これは月だから先頭の0を取ろう」と判断したりしているわけではありません。検索して覚えた文字を、そのまま別の場所に取り出しているだけです。
実務では何に使える?
今回は日付を例にしたため、数字を括弧で囲んで覚えておき、それを置換後の文字列に移動させました。
しかし、キャプチャグループで覚えておけるのは数字だけではありません。portion や electrode のような単語、さらに複数の単語からなる表現を検索し、その内容を残したまま別の位置に移動したり、別の表現の中に組み込んだりすることもできます。
例えば、英語の技術文書で、
the portion where an electrode is provided
のような表現を、
the portion on which an electrode is provided
という形にそろえたい場合を考えてみましょう。
このとき、portion や electrode の部分が別の単語や複合名詞に変わっても、それらを検索して一時的に覚えておき、置換後の文字列の中に戻すことができます。
つまり、毎回まったく同じ文字列を対象にするのではなく、同じパターンを持つ表現をまとめて処理できるわけです。
単語や複合名詞の検索について
今回はキャプチャグループと置換の仕組みを分かりやすくするため、数字だけを例にしました。portion や electrode のような単語、複数の単語からなる表現を正規表現でどのように検索するかについては、今後の記事で取り上げます。
翻訳やQAでは、「文字そのものは毎回違うけれど、構造は同じ」というデータを扱うことが少なくありません。正規表現でその構造を検索し、必要な部分を括弧で囲んで覚えておけば、その中身を残したまま大量の文字列を一括して変換できます。
memoQの検索・置換でも、この方法を利用できます。ただし、一括置換は大量の文字列を一度に変更できるだけに、実行前には検索結果を確認して、意図した文字列だけが対象になっていることを確認するのがおすすめです。
今回覚えておきたいこと
(\d{4}) や (\d{1,2}) のように、後から使いたい正規表現の部分を括弧で囲む。
囲んだ部分には左から、$1、$2、$3……という番号が対応します。
検索
(\d{4})年(\d{1,2})月(\d{1,2})日
置換
$2/$3/$1
必要なものを箱に入れて、あとで好きな順番で取り出す
正規表現でできることは、「探す」だけではありません。探した文字列の一部を残しながら、形を変える。
ここまでできるようになると、大量の文字列を扱う作業で正規表現が一気に便利になってきます。