scala – 重写字符串修改功能更强大
发布时间:2020-12-16 18:40:50 所属栏目:安全 来源:网络整理
导读:我正在读取文件中的行 for (line - Source.fromFile("test.txt").getLines) { ....} 我基本上想要最后得到一个段落列表.如果一行为空,则以新段落开头,我可能希望将来解析一些关键字 – 值对. 文本文件包含这样的条目列表(或类似的东西,如Ini文件) User=HansP
我正在读取文件中的行
for (line <- Source.fromFile("test.txt").getLines) { .... } 我基本上想要最后得到一个段落列表.如果一行为空,则以新段落开头,我可能希望将来解析一些关键字 – 值对. 文本文件包含这样的条目列表(或类似的东西,如Ini文件) User=Hans Project=Blow up the moon The slugs are going to eat the mustard. // multiline possible! They are sneaky bastards,those slugs. User=.... 我基本上想要一个List [Project],其中Project看起来像 class Project (val User: String,val Name:String,val Desc: String) {} 而描述是大块文本不是以< keyword> =开头,而是可以延伸到任意数量的行. 我知道如何以迭代的方式做到这一点.只需对关键字进行检查列表,然后填充类的实例,并将其添加到列表中以便稍后返回. 但我认为应该可以以适当的函数样式执行此操作,可能使用匹配大小写,yield和递归,从而生成包含User,Project等字段的对象列表.使用的类是已知的,所有关键字都是已知的,并且文件格式也不是一成不变的.我主要是想学习更好的功能风格. 解决方法
你显然正在解析一些东西,所以可能是时候使用……一个解析器了!
由于您的语言似乎将换行视为重要,因此您需要参考this question来告诉解析器. 除此之外,一个相当简单的实现 import scala.util.parsing.combinator.RegexParsers case class Project(user: String,name: String,description: String) object ProjectParser extends RegexParsers { override val whiteSpace = """[ t]+""".r def eol : Parser[String] = """r?n""".r def user: Parser[String] = "User=" ~> """[^n]*""".r <~ eol def name: Parser[String] = "Project=" ~> """[^n]*""".r <~ eol def description: Parser[String] = repsep("""[^n]+""".r,eol) ^^ { case l => l.mkString("n") } def project: Parser[Project] = user ~ name ~ description ^^ { case a ~ b ~ c => Project(a,b,c) } def projects: Parser[List[Project]] = repsep(project,eol ~ eol) } 以及如何使用它: val sample = """User=foo1 Project=bar1 desc1 desc2 desc3 User=foo Project=bar desc4 desc5 desc6 desc7 desc8 desc9""" import scala.util.parsing.input._ val reader = new CharSequenceReader(sample) val res = ProjectParser.parseAll(ProjectParser.projects,reader) if(res.successful) { print("Found projects: " + res.get) } else { print(res) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |