2016-11-07 5 views
0

В настоящее время с Scala 2.11 использование выражения регулярного выражения в сопоставлении с шаблоном не рекомендуется, если вы не согласны с Seq [Char] или Match, существует ли альтернативный подход. В настоящее время я реализовал getValueV2 с стратегией Seq [Char] в следующем примере, хотя он многословен и не выглядит достаточно хорошим.Устаревший - шаблон регулярного выражения Scala

Какие предложения у вас есть для замены регулярного выражения,

trait MyHelper { 
    //param Regex is deprecated 
def getValue(option: Option[scala.Any]): String = { 
    val param = """(?:String|Boolean)Option\((.*)\)""".r 
    option.getOrElse("") match { 
    case param(s) => s 
    case arr: Array[_] => arr.mkString("") 
    case _ => "" 
    } 
} 

def getValueV2(option: Option[scala.Any]): String = { 
    option.getOrElse("") match { 
     case s : String => s.toSeq match { 
     case p if p.endsWith(")") => p match { 
     case Seq('S', 't', 'r', 'i', 'n', 'g', 'O', 'p', 't', 'i', 'o', 'n', '(', [email protected]_*) => suffix.toString.substring(0, suffix.length -1) 
      case Seq('B', 'o', 'o', 'l', 'e', 'a', 'n', 'O', 'p', 't', 'i', 'o', 'n', '(', [email protected]_*) => suffix.toString.substring(0, suffix.length -1) 
      case _ => s     
     } 
     case _ => s 
     } 
     case arr: Array[_] => arr.mkString("") 
     case _ => "" 
    } 
    } 
} 

Я искал другую библиотеку под названием kantan.regex, но это, кажется, не имеют большого сообщества. Какой был бы лучший подход здесь, просто держитесь с регулярным выражением и игнорируйте устаревшие предупреждения?

ответ

1

Поскольку вы заинтересованы только в сопоставлении с входами String, проверьте тип перед применением регулярного выражения.

def getValue(option: Option[scala.Any]): String = { 
    val param = """(?:String|Boolean)Option\((.*)\)""".r 
    option.getOrElse("") match { 
    case str: String => str match { 
     case param(s) => s 
     case _ => "" 
    } 
    case arr: Array[_] => arr.mkString("") 
    case _ => "" 
    } 
} 

Это компилируется без предупреждения.

+0

Почти идеальный вариант, единственное исправление, которое я предлагаю, - это первый случай . _ => «" Должен быть case _ => str – raul782

+0

. У вашего оригинала 'getValue' не было этого в качестве возможного результата, но я вижу теперь, когда он был добавлен в 'V2'. Отлично. Я уверен, что есть другие моды, которые помогут вам выполнить ваши требования. Дело в том, что вы можете (и должны) использовать шаблоны Regex не устаревшим способом. – jwvh

+0

Достаточно честный, спасибо за помощь. – raul782