2010-10-27 36 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方法收集与该模式相匹配的元素。那么期望的结果应该是第一个也是唯一的元素。