2010-10-27 52 views
0

我需要做Scala中的一個模式,這是一個代碼:我應該如何匹配Scala中的模式?

object Wykonaj{ 

val doctype = DocType("html", PublicID("-//W3C//DTD XHTML 1.0 Strict//EN","http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"), Nil) 

    def main(args: Array[String]) { 
    val theUrl = "http://axv.pl/rss/waluty.php" 
    val xmlString = Source.fromURL(new URL(theUrl)).mkString 
    val xml = XML.loadString(xmlString) 
    val zawartosc= (xml \\ "description") 
val pattern="""<descrition> </descrition>""".r 
for(a <-zawartosc) yield a match{ 
case pattern=>println(pattern) 
} 
    }  
} 

的問題是,我需要做val pattern=any模式,從

<description><![CDATA[ <img src="http://youbookmarks.com/waluty/pic/waluty/AUD.gif"> dolar australijski 1AUD | 2,7778 | 210/A/NBP/2010 ]]> </description> 

只有它DOLAR australijski 1AUD得到| 2,7778 | 210/A/NBP/2010。

回答

1

嘗試

import scala.util.matching.Regex 

//... 

val Pattern = new Regex(""".*; ([^<]*) </description>""") 

//... 

for(a <-zawartosc) yield a match { 
    case Pattern(p) => println(p) 
} 

這是一個有點雜牌組裝電腦(我不使用Scala的經常的RE),但它似乎工作。 CDATA被串化爲&gt;實體,所以RE試圖在分號後和關閉描述標籤之前查找文本。

1
val zawartosc = (xml \\ "description") 
val pattern = """.*(dolar australijski.*)""".r 
val allMatches = (for (a <- zawartosc; text = a.text) yield {text}) collect { 
    case pattern(value) => value } 
val result = allMatches.headOption // or .head 

這主要是使用正確的正則表達式的問題。在這種情況下,您希望匹配包含dolar australijski的字符串。它必須允許dolar之前的額外字符。所以使用.*。然後使用parens標記你需要的開始和結束。請參閱Java api for the full doc

關於for的理解,我在進行匹配之前將XML元素轉換爲文本,然後使用collect方法收集與該模式相匹配的元素。那麼期望的結果應該是第一個也是唯一的元素。