貪欲でない正規表現
問題
以下のようなカンマ区切りのデータがあるとする。
,都道府県,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 に置換する
コメント