SHOEISHA iD

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

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

正規表現の問題集

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

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


  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード ソースコード (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の/を補完

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
正規表現の問題集連載記事一覧
この記事の著者

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

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

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1573 2008/10/23 13:34

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング