SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

貪欲でない正規表現

問題

以下のようなカンマ区切りのデータがあるとする。

,都道府県,2010年,2005年,1995年,1970年
,総数,128057352,127767994,125570246,104665171
1,東京都,13159388,12576601,11773605,11408071
2,神奈川県,9048331,8791597,8245900,5472247
3,大阪府,8865245,8817166,8797268,7620480
4,愛知県,7410719,7254704,6868336,5386163
5,埼玉県,7194556,7054243,6759311,3866472
6,千葉県,6216289,6056462,5797782,3366624
7,兵庫県,5588133,5590601,5401877,4667928
8,北海道,5506419,5627737,5692321,5184287
9,福岡県,5071968,5049908,4933393,4027416
10,静岡県,3765007,3792377,3737689,3089895

2列目(都道府県)と3列目(2010年の数値)だけ取り出したいと思って正規表現で置換してみた。

.*,(.*),(.*),.* → \1,\2 にしたい

でも、うまくいかない。

東京都,13159388
神奈川県,9048331
大阪府,8865245
……
……

にするにはどうしたらよい?

答え

正規表現は、まず .* と書くと、貪欲に(可能な限り長く)マッチさせに行くので、最初の .* で3列目(1,東京都,13159388)までマッチする。

量指定子(?, *, +, {})の次に?を書くと貪欲さは反転して、最小マッチになる。??, *?, +?, {}? と書く。

この例では、こうする。

.*?,(.*?),(.*?),.* → \1,\2 に置換する

関連するメモ

コメント