SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

正規表現の問題集

正規表現の問題集1(基本編)

肯定先読み・肯定戻り読み


ダウンロード ソースコード (2.0 KB)

3. 整数をカンマ区切りに置換

 次は、整数をカンマ区切りに置換する正規表現についてです。

置換条件
整数をカンマ区切りに置換する。

 対象データと期待する置換結果は、下記となります。

置換前
置換前
置換後
置換後

 カンマを置く処理は、

  1. 数字を右から数え、4文字あれば、4文字目と3文字目の間にカンマを置く。
  2. 数字を数え直し、4文字あれば、4文字目と3文字目の間にカンマを置く。
  3. 数字を数え直し、4文字あれば、4文字目と3文字目の間にカンマを置く。

 という処理を繰り返しますが、これを正規表現でどう実現するかが、この問題の難しいところです。

 答えは、下記となります。

答え
(?<=[0-9])(?=([0-9]{3})+$)
を
,
に置換

 肯定戻り読みは、指定したパターンの直後の位置にマッチします。たとえば、(?<=xy)はxyの直後の位置にマッチしますので、検索対象が

xyz

 であれば、文字yと文字zの間の位置にマッチします。

 答えについて解説すると、まず、肯定戻り読み(?<=[0-9])によって、数字の直後の位置にマッチします。この正規表現にマッチするのは、-123456789であれば、1と2の間、2と3の間、4と5の間、5と6の間、6と7の間、7と8の間、8と9の間、9と行末の間、となります。(?<=[0-9])なので-と1の間にはマッチしません。

 続いて、肯定先読み(?=([0-9]{3})+$)について、順を追って考えます。

 [0-9]{3}は、数字が3個連続した文字列にマッチします。([0-9]{3})+は、数字が3個連続した文字列が、1回以上連続する場合にマッチします。([0-9]{3})+$は前述の文字列が行末で終わる場合に、(?=([0-9]{3})+$)はその開始位置にマッチします。

 すなわち、(?=([0-9]{3})+$)は、

(数字が 3個連続して行末がある)位置、または
(数字が 6個連続して行末がある)位置、または
(数字が12個連続して行末がある)位置、または
(数字が15個連続して行末がある)位置、または
(数字が18個連続して行末がある)位置、または
(数字が21個連続して行末がある)位置、または
以下省略

 にマッチするということです。

 そして、(?<=[0-9])によって、数字の直後の位置にマッチすることと組み合わせます。すなわち、(?<=[0-9])(?=([0-9]{3})+$)は、

数字の直後の位置、かつ、(数字が 3個連続し行末がある)位置、または
数字の直後の位置、かつ、(数字が 6個連続し行末がある)位置、または
数字の直後の位置、かつ、(数字が12個連続し行末がある)位置、または
数字の直後の位置、かつ、(数字が15個連続し行末がある)位置、または
数字の直後の位置、かつ、(数字が18個連続し行末がある)位置、または
数字の直後の位置、かつ、(数字が21個連続し行末がある)位置、または
以下省略

 にマッチするということです。これは、ちょうどカンマを置く位置になるので、(?<=[0-9])(?=([0-9]{3})+$),に置換しています。正規表現のイメージは、下記となります。

正規表現のイメージ
正規表現のイメージ

次のページ
4. URLの/を補完

この記事は参考になりましたか?

正規表現の問題集連載記事一覧
この記事の著者

山岸 賢治(ヤマギシ ケンジ)

趣味が競技プログラミングなWebエンジニアで、OracleSQLパズルの運営者。AtCoderの最高レーティングは1204(水色)。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1573 2008/10/23 13:34

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー