2016-11-07 2 views
0

현재 패턴 일치에서 정규식을 사용하는 Scala 2.11에서는 Seq [Char] 또는 Match와 일치하지 않는 한 다른 방법이 있습니다. 현재는 다음 예제에서 Seq [Char] 전략을 사용하여 getValueV2를 구현했습니다. 자세한 정보 및 충분히 잘 보이지는 않지만. 나는 다른 라이브러리라는 kantan.regex 찾고 있었어요더 이상 사용되지 않음 - 스칼라 정규식 패턴 일치

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 _ => "" 
    } 
    } 
} 

는 어떤 다른 제안, 정규식 교체를 위해 당신이 할 수 있지만, 큰 커뮤니티를하지 않는 것 같습니다. 가장 좋은 접근법은 무엇입니까? 그냥 정규 표현식을 유지하고 무시 된 경고는 무시합니까?

답변

1

String 입력에 대해서만 매칭하고 싶기 때문에 Regex를 적용하기 전에 유형을 테스트하십시오.

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

거의 완벽하지만, 내가 제안하는 유일한 수정은 첫 번째 사례 _ => ""는 대소 문자가되어야 함 _ => str – raul782

+0

원본 'getValue'에는 가능한 결과가 없지만 보았습니다. 이제는 V2에 추가되었습니다. 아주 좋아. 나는 당신의 요구 사항을 충족시키기위한 다른 개조 물이 있다고 확신한다. 요점은 당신이 할 수 있습니다 (그리고해야합니다) 비현실적인 방식으로 정규식 패턴을 사용합니다. – jwvh

+0

공정한만큼, 도와 줘서 고마워. – raul782

관련 문제