我需要在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。
答案 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被字符串化为>
个实体,因此RE尝试在分号后和结束描述标记之前查找文本。