2010-03-17 4 views
10

나는 다음과 같은 코드 스칼라 2.8 (베타 1)의 옵션 그룹에 일치하기 위해 노력하고있어 :스칼라 : 옵션 정규 표현식 그룹을 일치

import scala.xml._ 

val StatementPattern = """([\w\.]+)\s*:\s*([+-])?(\d+)""".r 

def buildProperty(input: String): Node = input match { 
    case StatementPattern(name, value) => <propertyWithoutSign /> 
    case StatementPattern(name, sign, value) => <propertyWithSign /> 
} 

val withSign = "property.name: +10" 
val withoutSign = "property.name: 10" 

buildProperty(withSign)  // <propertyWithSign></propertyWithSign> 
buildProperty(withoutSign)  // <propertyWithSign></propertyWithSign> 

하지만이 작동하지 않습니다. 선택적 정규식 그룹을 일치시키는 올바른 방법은 무엇입니까?

답변

17

옵션 그룹은 그것이 당신이 패턴 일치에 "널 (null)"를 포함 할 필요가 있으므로 일치하지 않는 경우는 null 것 : 그 지적

import scala.xml._ 

val StatementPattern = """([\w\.]+)\s*:\s*([+-])?(\d+)""".r 

def buildProperty(input: String): Node = input match { 
    case StatementPattern(name, null, value) => <propertyWithoutSign /> 
    case StatementPattern(name, sign, value) => <propertyWithSign /> 
} 

val withSign = "property.name: +10" 
val withoutSign = "property.name: 10" 

buildProperty(withSign)  // <propertyWithSign></propertyWithSign> 
buildProperty(withoutSign)  // <propertyWithSign></propertyWithSign> 
+1

스칼라는 Regex.unapplySeq에서 Matcher.group 메소드를 사용합니다. 그룹이 순서의 일부와 일치하지 않으면 null이 반환되도록 지정합니다.

+2

스칼라가 null 체크를 필요로하지 않고 선택적 정규식 필드에 Option 클래스를 사용할 수 있다면 좋을 것입니다. –

0

정규식에 어떤 문제도 나타나지 않습니다. char 클래스에서 .을 탈출 할 필요는 없습니다.

편집 : 값이 선택적 부호를 가질 수있는 이름과 값을 캡처하려면

([\w.]+)\s*:\s*((?:+|-)?\d+) 

:

당신이 좋아하는 뭔가를 시도 할 수 있습니다.

+0

@codaddict 덕분에, 정규식 괜찮) 문제 스칼라 패턴 매칭 시스템을 사용하여 옵션 그룹과 일치시키는 사람을 볼 수없는 것입니까? 그리고 그물에 그렇게 할 아무런 예도 찾을 수 없습니다. –

+0

@codaaddict 고마워요, 내 코드는 작동하지만, 스칼라 패턴 매칭 질문은 여전히 ​​남아 있습니다 :) 실제로는 다른 XML이 필요한지 여부에 따라 기호가 필요합니다. 그래서 패턴 매칭 시스템을 사용하여 서명이 있는지 추출하고 테스트 해 보겠습니다. –