記事の要約
- 桁区切りされた数値は「\d+?(,\d{3})*」 で判定
- 数値を桁区切りに変換する表現は、「(\d+?)(?=(\d{3})+(?!\d))」で検索して 「$1,」 で置換
- Excelの表記設定やプログラミング言語の関数のほうが早いかも
カンマで桁区切りされた数値を判定する表現
カンマで桁区切りされた数値は次の正規表現にて表せます。
// カンマで桁区切りされた数値を表す
\d+?(,\d{3})*
意味を少し解説します。前半の”\d+?”は
- 4桁以上の場合は、カンマ以前の1〜3桁
- 3桁以下の場合は、その3桁以下の数値
を表します。
後半の”(,\d{3})*”は
- 4桁以上の場合は、カンマ含むカンマ以降のすべての桁
- 3桁以下の場合は、なし
を表します。「”,\d{3}”の組み合わせを0回以上」を意味することとなります。
これらの前後半を足し合わせると3桁ごとにカンマ区切りされた数値を探せます。
数値をカンマ区切りにする変換方法
数値をカンマ区切りに置換したい際には次のように入力しましょう。
// 検索
(\d+?)(?=(\d{3})+(?!\d))
//置換
$1,
これも前後半の表現にわけて解説します。
前半の(\d+?)は、1桁〜3桁までの数値をグループ化したものです。それぞれ解説すると下のとおりです。
- \dは[0-9]
- +は直前の文字を1回以上繰り返し
- ?は+を最短マッチに指定する
- ()はここでは置換の対象とするためのグループ化
後半の(?=(\d{3})+(?!\d))は、(\d{3})+は3桁の数値が1回以上登場すること、(?!\d)は数値が登場しないこと、これら全体を囲う(?= )は肯定先読みを表します。
(\d{3})+は、3桁の数値が1回以上なので3,6,9…回のように3の倍数回出現した場合に該当するようになります。
前後半をまとめると
- (\d+?)は最初の1〜3桁にヒットする。カンマで区切る前半部分
- (?=(\d{3})+(?!\d))は続く3,6,9…の桁の前方位置にヒットする。カンマで区切る後半部分。カンマは一度に全部つけるのではなく都度、該当するパターンがあるたびに前後半で分けて間にカンマを打つイメージです。
となり1,234,567,890のようにカンマを打てるという方法です。
そもそも正規表現でやらないという方法
正規表現で調整しようとすると上記のように複雑な式になりがちですが、Excelやスプレッドシートであれば表示形式でカンマ桁区切りに変更したり、プログラミングであれば言語にある関数で処理したりするほうが簡単だと思います。
たとえばJavaScriptでカンマ桁区切りをしようとすると
num = 1234567890;
num.toLocaleString(); // "1,234,567,890"
これだけのシンプルな関数で変換できてしまいます。
シャワーズ
正規表現は独自の置換をするのには便利です。ただシステムや言語に含まれている関数で処理できるものまでを無理に正規表現でがんばる必要はないかなというのが本音です