我应该如何匹配Scala中的模式?

时间:2010-10-27 12:59:06

标签: 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。

2 个答案:

答案 0 :(得分: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方法收集与模式匹配的元素。那么期望的结果应该是第一个也是唯一的元素。

答案 1 :(得分:1)

尝试

import scala.util.matching.Regex

//...

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

//...

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

这有点像kludge(我不经常使用RE与Scala),但似乎有效。 CDATA被字符串化为&gt;个实体,因此RE尝试在分号后和结束描述标记之前查找文本。