正規表現置換で、数字3ケタおきにカンマを挿入する方法

正規表現

目次

アプリケーションの画面に値段や距離などの数字を表示する際、
多くの場合、3ケタおきにカンマが挿入されています。

  • \10,000
  • $1,200
  • 2,000,000m

正規表現置換を用いることで、元々カンマが挿入されていない数字に対して、
カンマを挿入することができます。

実際にやってみた

以下の文字列があります。

1
12
123
1234
12345
123456
1234567
12345678
123456789
\10000
$2000
3000000m
“123”,”1234″,”12345″

以下の条件で、正規表現置換を行います。

置換前

\B(?=(\d{3})+(?!\d))

置換後

,

この条件で置換を行うと次のような結果になります。

以下のように置換されました。
3ケタおきにカンマが挿入されたことが分かります。

1
12
123
1,234
12,345
123,456
1,234,567
12,345,678
123,456,789
\10,000
$2,000
3,000,000m
“123”,”1,234″,”12,345″

解説

「\B(?=(\d{3})+(?!\d))」は、『単語の境界以外かつ、3の倍数の桁数の数字が続いた後に数字以外が続く位置』
という意味になります。

5つのステップで、順を追って解説します。

①3ケタの数字を表す正規表現

3ケタの数字を表す正規表現は以下の通りです。

\d{3}

これで検索すると、次のような結果になります。

3ケタの数字が検索に引っかかります。

ただし、これは左から数えて3ケタの数字が引っかかってしまいます。

今回は数値として、右から数えて3ケタの数字を検索したいので、これを②のように修正します。

②右から数えて3ケタの数字を検索する

3ケタの数字を右から検索するためには、以下の正規表現を用います。

\d{3}(?!\d)

これで検索すると、次のような結果になります。

右から数えて3ケタの数字が検索に引っかかりました。

(?!\d)というのは否定先読みの正規表現です。

※こちらの記事で詳しく解説しています→~を含まない行の検索

①の正規表現に否定先読みを続けたことにより、「3ケタの数字の後に数字以外が続く箇所
という意味になります。

③位置で考える

②までの正規表現は、数字自体を検索するためのものでした。

今回は、3ケタおきにカンマを挿入する都合上、位置で考える必要があります。

肯定先読みの正規表現を用いて②までの正規表現を囲みます。

(?=\d{3}(?!\d))

これで検索すると、次のようになります。

サクラエディタの表示の都合上、右から3ケタ目の数字が検索に引っかかっているように見えますが、
実際は②で引っかかった箇所の先頭の位置が検索に引っかかっています。

この正規表現は「3ケタの数字の後に数字以外が続く位置」という意味になります。

位置を置換する

正規表現置換を使用して、③で検索に引っかかった位置を「,」に置換してみます。

右から数えて3ケタの位置に対してカンマが挿入されました。

4~6行目は想定通りに置換できています。

ただし、この正規表現置換には以下の問題点があります。

  • 3ケタの数字(3行目,13行目)に対してもカンマが挿入されてしまう
  • 3ケタ目のみにカンマが挿入されて、6ケタ目や9ケタ目にはカンマが挿入されていない

次のステップでこれらの問題に対処します。

④3ケタの数字に対してはカンマを挿入しないようにする

3ケタの数字に対してカンマを挿入しないようにするために、「\B」という正規表現を使用します。

\B(?=\d{3}(?!\d))

これで置換すると、このような結果になります。

3行目や13行目の3ケタの数字に対しては、カンマが挿入されなくなりました。

「\B」は単語の境界以外の位置という意味です。

数字の先頭文字は単語の先頭、つまり単語の境界の位置に当たります。
そのため、単語の境界以外の位置を表す「\B」は、数字の先頭の箇所には該当しなくなり、
3行目や13行目などの3文字の数字に対してはカンマが挿入されなくなります。

この正規表現全体は「単語の境界以外の位置かつ3ケタの数字の後に数字以外が続く位置」という意味になります。

⑤6ケタ目や9ケタ目に対してもカンマを挿入する

次に3ケタ目だけでなく、6ケタ目や9ケタ目にもカンマが挿入されるように考えます。

④まではこのような正規表現を使用していましたが、

\B(?=\d{3}(?!\d))

「{3}」の箇所を「{6}」に変更してみます。

\B(?=\d{6}(?!\d))

これで置換すると、このような結果になります。

右から数えて3ケタ目ではなく、6ケタ目にカンマが挿入されるようになりました。

この正規表現は「単語の境界以外の位置かつ6ケタの数字の後に数字以外が続く位置」という意味になります。

さらに「または」を表す「|」を使用すれば、右から3ケタ目の位置と6ケタ目の位置を同時に検索できるようになります。

\B(?=\d{3}(?!\d))|\B(?=\d{6}(?!\d))

これで置換すると、このような結果になります。

右から数えて、3ケタ目と6ケタ目に対してカンマが挿入されるようになりました。

この正規表現は「単語の境界以外の位置かつ3ケタの数字の後に数字以外が続く位置または単語の境界以外の位置かつ6ケタの数字の後に数字以外が続く位置」という意味になります。

これで、うまくいきました!
めでたし、めでたし。

という訳にはいきません。

というのも、この正規表現では、数字の桁数が10ケタ…20ケタと増えた場合でも、3ケタ目と6ケタ目にしかカンマを挿入できません。

どんなに桁数が増えた場合でも、9ケタ目、12ケタ目、15ケタ目……といった具合にカンマが挿入されてほしいのです。

そこで、冒頭の完成形の登場です。

\B(?=(\d{3})+(?!\d))

これで置換すると、冒頭のようになります。

この正規表現は「単語の境界以外の位置かつ3の倍数の桁数の数字の後に数字以外が続く位置」という意味になります。

つまり、3ケタ目、6ケタ目、9ケタ目……のように3の倍数の桁数の位置にマッチするようになります。

「\d{3}」という箇所を丸カッコで囲んで、直後に「+」をつけて、「(\d{3})+」とすることで、

3ケタの数字をまとめて、1回以上繰り返す」という意味になります。

これはつまり、3の倍数の桁数という意味です。

これで、数字に対して、カンマを挿入することができるようになりました。

まとめ

今回は、数字に対して、3ケタおきにカンマを挿入する方法について解説しました。

中々複雑な正規表現になってしまったため、1回で理解するのは難しいかもしれません。

ただ、システム開発においては使用頻度の高い正規表現ですので、結論だけでも覚えていってください!

正規表現についての別記事についてもご覧ください!

★検索
パスワードの正規表現の考え方
「~を含まない行」を検索する方法
「~を含む行」を検索する方法
「~で終わる」を検索する方法
「~で始まる」を検索する方法
正規表現繰り返しの考え方

最短一致検索を行う方法
否定の文字クラス
「または」検索を行う方法

環境による「\d」の動作の違いについて検証

★置換
正規表現置換の考え方
大文字⇔小文字変換を行う方法
キャメルケース⇔スネークケース変換を行う方法
CSVを囲みなし⇒囲みありに変換する方法

CSVファイルの特定のカンマ以降を削除する方法
CSVファイルの必要な箇所だけ残す方法
数字3ケタおきにカンマを挿入する方法
正規表現置換で不要な行を削除し、必要な行だけ残す方法
数字を0埋めする方法
0埋めされた数字を0埋めなしに変換する方法
ファイル名から、拡張子のみを抽出する方法
Javaで正規表現置換を行う方法

また、Udemyという動画教育プラットフォームで動画解説を行っております。
動きを確認しながら丁寧に学習したいという方は、ぜひご覧ください!

正規表現入門 作業効率アップに役立つ38個の方法

コメント

タイトルとURLをコピーしました