2010-03-17 38 views
10

Tôi đang cố gắng để phù hợp trên một nhóm tùy chọn trong Scala 2.8 (beta 1) với đoạn mã sau:Scala: Kết hợp tùy chọn nhóm Regular Expression

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> 

Nhưng điều này không hoạt động. Cách chính xác để phù hợp với các nhóm regex tùy chọn là gì?

Trả lời

17

Các nhóm tùy chọn sẽ được null nếu nó không được phù hợp, do đó bạn cần phải bao gồm "null" trong mô hình phù hợp:

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

Scala sử dụng phương thức Matcher.group trong Regex.unapplySeq. Điều này xác định rằng nếu một nhóm không khớp với một phần của chuỗi, thì null được trả về -

+2

Sẽ tốt hơn nếu Scala có thể sử dụng lớp Tùy chọn cho trường regex tùy chọn thay vì yêu cầu kiểm tra rỗng. –

0

Tôi không thấy bất kỳ vấn đề nào với regex của bạn. Mặc dù bạn không cần phải thoát khỏi . trong lớp char.

EDIT:

Bạn có thể thử một cái gì đó như:

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

Để nắm bắt được tên và giá trị mà giá trị có thể có một dấu hiệu bắt buộc.

+0

@codaddict nhờ đã chỉ ra rằng;) Các regex là tốt, vấn đề là tôi không thể xem ai phù hợp với nhóm tùy chọn bằng cách sử dụng hệ thống đối sánh mẫu Scala. Và tôi không thể tìm thấy ví dụ nào để làm như vậy trên mạng –

+0

@codaaddict Cảm ơn, điều đó sẽ giúp mã của tôi hoạt động, nhưng câu hỏi phù hợp với mẫu Scala vẫn còn :) Tôi thực sự cần XML khác nhau dựa trên việc có hay không , do đó, sử dụng hệ thống khớp mẫu để trích xuất và kiểm tra nếu có một dấu hiệu có vẻ như giải pháp sạch nhất đối với tôi –

Các vấn đề liên quan