2010-12-21 5 views
0

첫째, ... 는 추출기에서 목록을 얻기 - 심지어 매치

scala> var nameRE = """\W*(\w+)\W+(\w+)\W*""".r 
nameRE: scala.util.matching.Regex = \W*(\w+)\W+(\w+)\W* 

scala> var nameRE(first, last) = "Will Smith " 
first: String = Will 
last: String = Smith 

가 그럼 난 이놈 같았다 ... 멋진 같았다

scala> var listOfVowels = "(([aeiou])*)".r 
listOfVowels: scala.util.matching.Regex = (([aeiou])*) 

scala> var listOfVowels(vowels:List[String]) = "uoiea" 
<console>:7: error: scrutinee is incompatible with pattern type; 
found : List[String] 
required: java.lang.String 
     var listOfVowels(vowels:List[String]) = "uoiea" 

지금은 ... 같이 해요

scala> (listOfVowels findFirstMatchIn "uoiea" get) subgroups 
res35: List[String] = List(a) 

[내 질문에 분명하지 않은 경우 : 추출기에서 패턴과 실제로 일치하는 모든 하위 그룹의 목록을 얻는 방법은 무엇이든 상관없이 두 번째 수준의 일치자를 작성하지 않아도됩니다. 정답은 물론 List(u, o, i, e, a)입니다. ]

답변

2

이것은 당신이 패턴을 추출하게됩니다 :

scala> var listOfVowels(vowels @ _*) = "uoiea" 
vowels: Seq[String] = List(uoiea, a) 

그러나, 패턴은 당신이 그것을 기대하지 않는다 - 그것은 여러 그룹을 생성하지 않습니다. 정규식 라이브러리 규칙은 한 세트의 괄호, 하나의 그룹 및 모든 정규식 내가 그런 식으로 작동합니다.

+0

모든 reqex * api *가 이러한 방식으로 작동하지만 기본 라이브러리는 확실히 중첩 그룹을 지원합니다. 스칼라 API는 중첩 된 그룹을 노출시키지 않을뿐만 아니라 스칼라에 익숙해 져서 대부분의 다른 언어가 빠지기 쉬운 영역에서 빠져 나오지 않았습니다. 아, 그럼, 완벽에 대한 추구가 계속됩니다. – Malvolio

+0

@Malvolio 아, 글쎄, 내가 그걸 줄께. 나는 그것이 효과가 있기를 바랬다. 아아, 나는 스칼라의 정규 표현식에 대한 오랜 사랑의 이야기를 싫어한다. 낙원을 엿볼 수는 있지만 뒤이어 계속되지 않습니다. 좋은 API로 정착했다면, 지금까지 교체 라이브러리를 만들었을 것입니다. –

2

내 지식에 따라 정규식에서 유형 (E) *의 하위 패턴을 문자열 목록으로 변환 할 수 없습니다. Scala에서 사용되는 정규 표현식 메커니즘이 정규 표현식 (java.util.Pattern, java.util.Matcher 등)에 대한 JDK의 기본 구현을 사용하여 구현되고이 구현은 여러 가지 하위 패턴 캡처를 지원하지 않기 때문입니다. 일치하는 경우 하위 패턴 (E) *은 해당 하위 패턴의 마지막 일치 만 캡처합니다. 내 지식에,이 행동은 심지어 정규식 구현의 대부분에 대해 사실 보유하고 있습니다.

나는 귀하의 경우는 실제 문제의 단순화 된 버전 인 생각하지만

는 설명 된 경우에 대한 간단한 해결책은 존재한다 : 도움이

scala> "[aeiou]".r findAllIn "hello, world!" toList 
res1: List[String] = List(e, o, o) 

희망을.

1

이것은 조금 비현실적입니다.

scala> implicit def mkRr(regex: String) = new { def rr = new { def unapply(s: String) = (regex.r findAllIn s toList) match { case Nil => None ; case xs => Some(xs) } } } 
mkRr: (regex: String)java.lang.Object{def rr: java.lang.Object{def unapply(s: String): Option[List[String]]}} 

scala> val ListOfVowels = "[aeiou]".rr 
ListOfVowels: java.lang.Object{def unapply(s: String): Option[List[String]]} = [email protected] 

scala> val ListOfVowels(vowels) = "uoiea" 
vowels: List[String] = List(u, o, i, e, a)