복붙노트

[SCALA] 스칼라 정규식 일치 자바 하나의 성공, 실패

SCALA

스칼라 정규식 일치 자바 하나의 성공, 실패

후속 코드에서 같은 패턴은 자바 API는 스칼라 패턴 매칭을 사용하지 않을 경우 사용할 수 있지만 때와 일치합니다.

import java.util.regex.Pattern

object Main extends App {
  val text = "/oAuth.html?state=abcde&code=hfjksdhfrufhjjfkdjfkds"

  val statePatternString = """\/.*\?.*state=([^&\?]*)"""
  val statePattern = statePatternString.r
  val statePatternJ = Pattern.compile(statePatternString)

  val sj = statePatternJ.matcher(text)
  val sjMatch = if (sj.find()) sj.group(1) else ""
  println(s"Java match $sjMatch")

  val ss = statePattern.unapplySeq(text)
  println(s"Scala unapplySeq $ss")
  val sm = statePattern.findFirstIn(text)
  println(s"Scala findFirstIn $sm")

  text match {
    case statePattern(s) =>
      println(s"Scala matching $s")
    case _ =>
      println("Scala not matching")
  }

}

응용 출력은 다음과 같습니다

무슨 일이 실패 스칼라 정규식 unapplySeq를 일으키는?

해결법

  1. ==============================

    1.당신이 스칼라 패턴을 정의 할 때 자바 sj.find ()는 문자열 안에 일치 어느 곳을 찾고있는 동안, 그것은, 기본 (= 전체 문자열이 일치해야 함)에 의해 고정된다. 또한 부분 일치를 허용하도록 스칼라 정규식에 대한 .unanchored 추가 :

    당신이 스칼라 패턴을 정의 할 때 자바 sj.find ()는 문자열 안에 일치 어느 곳을 찾고있는 동안, 그것은, 기본 (= 전체 문자열이 일치해야 함)에 의해 고정된다. 또한 부분 일치를 허용하도록 스칼라 정규식에 대한 .unanchored 추가 :

    val statePattern = statePatternString.r.unanchored
                                           ^^^^^^^^^^^
    

    참조 IDEONE 데모

    일부 비 고정 정규식 참조 :

    대체 솔루션 패턴 끝에 *.을 추가하는 것을 의미하지만, 점은 기본적으로 줄 바꿈과 일치하지 않음을 기억합니다. 솔루션은 일반적인해야하는 경우 (?들) DOTALL 수정은 반드시 잠재적 인 개행 시퀀스 전체 문자열이 일치 할 패턴의 시작 부분에 지정해야합니다.

  2. from https://stackoverflow.com/questions/36155207/scala-regex-match-fails-java-one-suceeds by cc-by-sa and MIT license