2014-11-02 8 views
2

나는 그것이 기대하는 것과는 다른 일을하고 있기 때문에 이해력의 작동 방법을 추론하려고합니다. 나는 몇 가지 대답을 읽었는데, 가장 관련성이 높은 것은이 하나이다 Scala "<-" for comprehension 그러나 나는 여전히 당황 스럽다.스칼라 정규식과 이해를 위해

다음 코드 은 예상대로 작동합니다..

file.getLines().foreach { line => 
     val whidSession: String = rWhidSession.findAllMatchIn(line) flatMap {m => m.group(1)} mkString "" 
     val whidArg: String = rWhidArg.findAllMatchIn(line) flatMap {m => m.group(1)} mkString "" 
     if(whidSession != whidArg) println(line) 
    } 

다음이있다 : 두 개의 다른 정규 표현식에 일치 값이 동일하지 않은 라인 (얻기 인수의 값에 대한 세션 쿠키의 값과 다른 하나의 단지 컨텍스트를 제공하기 위해)를 인쇄

/** 
    * This would compare letters, regardless of the use of mkString.. even without the flatMap step. 
    */ 

    val whidTuples = for { 
    line <- file.getLines().toList 
    whidSession <- rWhidSession.findAllMatchIn(line) flatMap {m => m.group(1) mkString ""} 
    whidArg <- rWhidEOL.findAllMatchIn(line) flatMap {m => m.group(1) mkString ""} if whidArg != whidSession 
    } yield line 
+1

두 번째 버전이 첫 번째 버전과 차이가 있는지 (한눈에 한 눈에) :'whidSession <- ...'행에서'mkString ""부분은 다음과 같습니다. 첫 번째 경우와 마찬가지로 외부 대신 {} 안에 있습니다. 곤충? –

+0

첫 번째 스 니펫에서는 'rWhidArg' 정규 표현식을 사용하지만 두 번째'rWhidEOL' 표현식을 사용합니다. 어쩌면 두 번째 정규식이 모든 기호에서 일치 할 수 있습니까? –

답변

1

대응 일치 동일 확인하려면 : 다양한 문자 두 값에 있기 때문에, 따라서 광고를 여러 번 인쇄 문제 코드 일치하는 문자열 내의 글자 반복하여

라인에
scala> val ss = "foo/foo" :: "bar/bar" :: "foo/bar" :: Nil 
ss: List[String] = List(foo/foo, bar/bar, foo/bar) 

scala> val ra = "(.*)/.*".r ; val rb = ".*/(.*)".r 
ra: scala.util.matching.Regex = (.*)/.* 
rb: scala.util.matching.Regex = .*/(.*) 

scala> for (s <- ss; ra(x) = s; rb(y) = s if x != y) yield s 
res0: List[String] = List(foo/bar) 

하지만 수 있도록 여러 일치 :

scala> val ss = "foo/foo" :: "bar/bar" :: "baz/baz foo/bar" :: Nil 
ss: List[String] = List(foo/foo, bar/bar, baz/baz foo/bar) 

이 여전히 첫 경기 비교할 것이다 :

scala> val ra = """(\w*)/\w*""".r ; val rb = """\w*/(\w*)""".r 
ra: scala.util.matching.Regex = (\w*)/\w* 
rb: scala.util.matching.Regex = \w*/(\w*) 

scala> for (s <- ss; ma <- ra findAllMatchIn s; mb <- rb findAllMatchIn s; ra(x) = ma; rb(y) = mb if x != y) yield s 
res3: List[String] = List(baz/baz foo/bar, baz/baz foo/bar, baz/baz foo/bar) 

또는

:
scala> val ra = """(\w*)/\w*""".r.unanchored ; val rb = """\w*/(\w*)""".r.unanchored 
ra: scala.util.matching.UnanchoredRegex = (\w*)/\w* 
rb: scala.util.matching.UnanchoredRegex = \w*/(\w*) 

scala> for (s <- ss; ra(x) = s; rb(y) = s if x != y) yield s 
res2: List[String] = List() 

그래서 모든 일치 비교
scala> for (s <- ss; (ma, mb) <- (ra findAllMatchIn s) zip (rb findAllMatchIn s); ra(x) = ma; rb(y) = mb if x != y) yield s 
res4: List[String] = List(baz/baz foo/bar) 

scala> for (s <- ss; (ra(x), rb(y)) <- (ra findAllMatchIn s) zip (rb findAllMatchIn s) if x != y) yield s 
res5: List[String] = List(baz/baz foo/bar) 

여기서 일치 항목 ra(x) = ma은 정규식을 재평가해서는 안되며 ma group 1 일뿐입니다.