文字列内の数値をインクリメントする
/** * 文字列内の数値をインクリメントする * ex) TextIncrementer("abc123efg456hij").++() // abc124efg457hij * ex) TextIncrementer("あいう1 2 3えお").++() // あいう2 3 4えお * @param t インクリメントしたい文字列 * @param incrValue いくつインクリメントするか * @return インクリメントした文字列 */ case class TextIncrementer(t: String, incrValue: Int = 1) { def ++(i: Int = 0, n: String = ""): String = { n match { case "" => ++(1, t.slice(0, 1)) case _ if (i > t.length) => n // end case _ => { //println(i, n) n.takeRight(1).exists(_.isDigit) match { // abc1 1が数値か case true => { val c = sequenceNumberCount(i) val nn = n.dropRight(1) // abc1 -> abc val inc = t.slice(i - 1, c).toInt + incrValue ++(c + 1, nn + inc + t.slice(c, c + 1)) } case false => ++(i + 1, n + t.slice(i, i + 1)) } } } } private def sequenceNumberCount(i: Int): Int = { t.slice(i, i + 1).exists(_.isDigit) match { case true => sequenceNumberCount(i + 1) case false => i } } }
オートマトンにしようかと思ったけどまぁ...
正規表現版
"hoge1 = 9999;".gsub(/\d+/) {|i| i.to_i + 1 } // "hoge2 = 10000;"