2010-10-27 5 views
0

je dois faire un modèle dans Scala, c'est un code:Comment devrais-je faire correspondre un motif dans 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) 
} 
    }  
} 

Le problème est, je dois faire modèle val pattern=any, pour obtenir de

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

seulement il dolar australijski 1AUD | 2,7778 | 210/A/NBP/2010.

Répondre

1

Essayez

import scala.util.matching.Regex 

//... 

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

//... 

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

Il est un peu bidouille (je ne l'utilise avec Scala très REs souvent), mais il semble fonctionner. Le CDATA est stringifié en &gt; entités, de sorte que le RE essaie de trouver du texte après un point-virgule et avant une balise de description de fermeture.

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 

Il s'agit principalement d'utiliser l'expression régulière correcte. Dans ce cas, vous voulez faire correspondre la chaîne qui contient dolar australijski. Il doit permettre des caractères supplémentaires avant dolar. Donc, utilisez .*. Ensuite, utilisez les parens pour marquer le début et la fin de ce dont vous avez besoin. Reportez-vous au Java api for the full doc.

En ce qui concerne la compréhension for, je convertis l'élément XML en texte avant de faire la correspondance, puis de collecter ceux qui correspondent au modèle en utilisant la méthode collect. Ensuite, le résultat souhaité devrait être le premier et le seul élément.

Questions connexes