2016-10-03 10 views
0

정규식 질문이 있습니다. 다음은 URL에서 ID를 잡기 위해 정규식입니다 - 대소 문자를 구별하지 : 그것은 내 주제와 일치이 캡처 그룹을 잡으려고 할 때 왜 MatchError가 발생합니까?

scala> val idRegex = """(?i)images\/(.*)\.jpg""".r 
idRegex: scala.util.matching.Regex = (?i)images\/(.*)\.jpg 

:

scala> val slidephotoId = idRegex.findFirstIn("/xml/deliverables/images/23044.jpg") 
slidephotoId: Option[String] = Some(images/23044.jpg) 

을하지만 추출기로 사용할 때이 일치 오류가 발생합니다 :

scala> val idRegex(id) = "/xml/deliverables/images/23044.jpg" 
scala.MatchError:/xml/deliverables/images/23044.jpg (of class java.lang.String) 
    ... 43 elided 

내가 뭘 잘못하고 있니? 당신이 당신의 정규식 비 고정 할 경우 - - 스칼라에서

답변

2

정규 표현식은 은 기본적으로이 (- 그들은 전체 입력과 일치해야 의미)에 고정되어이 작동합니다 : 물론, 또 다른 옵션을

scala> val idRegex = """(?i)images\/(.*)\.jpg""".r.unanchored 
idRegex: scala.util.matching.UnanchoredRegex = (?i)images\/(.*)\.jpg 

scala> val idRegex(id) = "/xml/deliverables/images/23044.jpg" 
id: String = 23044 

입니다 는 전체 입력, 예를 차지하고 있도록 정규식을 변경하려면 다음 findFirstIn 방법으로

scala> val idRegex = """(?i).+images\/(.*)\.jpg""".r 
idRegex: scala.util.matching.Regex = (?i).+images\/(.*)\.jpg 

scala> val idRegex(id) = "/xml/deliverables/images/23044.jpg" 
id: String = 23044 

- 분명히 정규 표현식이되는 관계없이 올바른 결과를 반환 미친 짓을하든 안하든 - 정의에 따르면 매치를 찾기 위해 입력을 스캔 할 수 있으며 전체 입력이 일치 할 필요는 없습니다.