2014-12-26 7 views
2

스칼라의 정규 표현식에서 패턴 일치로 추출 된 그룹이 findAllIn 함수를 사용하여 추출 된 그룹과 다릅니다.스칼라 정규식 패턴은 findAllIn을 사용하는 정규 표현식 패턴과 일치하지 않습니다.

1) 여기서 사용하여 패턴 매치 추출의 일례이다 -

scala> val fullRegex = """(.+?)=(.+?)""".r 
fullRegex: scala.util.matching.Regex = (.+?)=(.+?) 

scala> val x = """a='b'""" 
x: String = a='b' 

scala> x match { case fullRegex(l,r) => println(l); println(r) } 
a 
'b' 

2) 여기 findAllIn 기능하여 추출하는 예이다 -

scala> fullRegex.findAllIn(x).toArray 
res4: Array[String] = Array(a=') 

내가 반환 된 배열을 기대 하였다 findAllIn을 Array (a, 'b')로 사용합니다. 왜 그렇게하지 않습니까?

+0

BTW, 나는 unapplySeq 완벽하게 추출의이 종류를한다는 것을 발견)) – Bharadwaj

답변

1

두 번째 게으른 일치가 어느 정도까지 진행되어야하는지 지정하지 않았기 때문입니다. 그래서 = 이후에 그것은 단지 하나의 문자를 소비하고 그것이 느린 모드 에서처럼 멈춘다.

여기를 참고하십시오. findAllInMatcher.find를 사용하는 반면 .+?=.+

https://regex101.com/r/dU7oN5/10

변경은, 특히

+0

그게 나에게 캡처 된 그룹의 깔끔한 배열 /리스트를 갖게하지는 않습니다. 나는 이것을했다 - scalare> val fullRegex = "" "(. +?) = (. +)" ""r fullRegex : scala.util.matching.Regex = (. +?) = (. +) scala> fullRegex.findAllIn (x) .toArray res1 : 배열 [문자열] = 배열 ​​(a = 'b') – Bharadwaj

+0

@Bharadwaj 이건 네가 원한거야'(a = 'b') ' – vks

+0

사실, 실제로 예 – Bharadwaj

0

unapplySeq의 패턴 일치의 사용 Matcher.matches를 사용하여 전체 배열을 얻을 수 있습니다. matches은 전체 입력을 일치시킵니다. 옵션 [목록 [문자열]] = 일부 (목록 (A, 'B':> fullRegex.unapplySeq (x)의 스칼라 이 res0 -

scala> import java.util.regex._ 
import java.util.regex._ 

scala> val p = Pattern compile ".+?" 
p: java.util.regex.Pattern = .+? 

scala> val m = p matcher "hello" 
m: java.util.regex.Matcher = java.util.regex.Matcher[pattern=.+? region=0,5 lastmatch=] 

scala> m.matches 
res0: Boolean = true 

scala> m.group 
res1: String = hello 

scala> m.reset 
res2: java.util.regex.Matcher = java.util.regex.Matcher[pattern=.+? region=0,5 lastmatch=] 

scala> m.find 
res3: Boolean = true 

scala> m.group 
res4: String = h 

scala>