読者です 読者をやめる 読者になる 読者になる

webネタ

技術系ブログ。web系SE。1988。♂。@rhong_

文字列内の数値をインクリメントする

/**
 * 文字列内の数値をインクリメントする
 * 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;"