2016-02-21 42 views
2

有String的斯卡拉列表,每個字符串都有一個鍵/值格式如下:我怎麼辦正則表達式模式匹配Scala中

<row Id="25780063" PostTypeId="2" ParentId="25774527" CreationDate="2014-09-11T05:56:29.900" /> 

每個字符串可能有一些額外的鍵/值。我想爲每個字符串提取幾個鍵的值。這裏是在花樣我定義,但它不能正常工作

val idPattern = "Id=(.*).r 
val typePattern = "PostTypeId=(.*)".r 

我怎樣才能正確地提取「ID」和「PostTypeId」的價值?

+0

scala.util.matching.Regex的scaladoc很不錯。 –

回答

1

使其成爲非錨定的說,找到的匹配,而不是所有的輸入。

scala> val id = """Id="([^"]*)"""".r.unanchored 
id: scala.util.matching.UnanchoredRegex = Id="([^"]*)" 

scala> """stuff Id="something" more""" match { case id(x) => x } 
res7: String = something 

scala> id.findFirstIn("""stuff Id="something" more""") 
res8: Option[String] = Some(Id="something") 
+0

謝謝。你能告訴我什麼'未錨定'在這裏意味着什麼? –

+0

如果字符串與模式不匹配,該怎麼辦?目前它返回一個錯誤信息。我該怎麼辦? –

+0

在正則表達式中,表示匹配開始和結束輸入的^和$稱爲錨點。通常,當匹配所有輸入時,它的行爲就好像錨定一樣,因此未錨定表示模式匹配輸入中的任何位置。要在scala匹配中提供默認情況,請使用'case _ =>'。 –

0

首先,您必須將正則表達式定義爲有效的穩定標識符。

val IdPattern = "Id=(.*).r 
val TypePattern = "PostTypeId=(.*)".r 

注意首字母大寫,模式匹配需要(或使用反引號,如果真的想小寫)。

然後,

aString match { 
    case IdPattern(group) => println(s"id=$group") 
    case TypePattern(group) => println(s"type=$group") 
} 
+0

您對大寫字母的評論對於提取器模式不適用。 –

+0

我不認爲我的正則表達式是正確的,因爲PostTypeId選擇一切到字符串末尾 –