Scala文件和正则表达式

  • Source.fromFile().getLines.toArray输出文件的所有行。
  • Source.fromFile().mkString以字符串形式输出文件内容。
  • 将字符串转换成数字,可以用toInt或toDouble方法。
  • 用java的PrintWriter来写入文本文件。
  • "正则".r是一个Regex对象。
  • 如果你的正则表达式包含反斜杠或引号的话,用"""..."""

行操作

import scala.io.Source
val source = Source.fromFile("myfile.txt","UTF-8")
//第一个参数可以使字符串或java.io.File

val lineIterator = source.getLines//结果是一个迭代器
val lines = source.getLines.toArray
val contents = source.mkString
//把整个文件读取成一个字符串

读取字符

要从文件中读取单个字符,可以直接把Source对象当做迭代器:

for (c <- source)

读取词法单元和数字

val tokens = source.mkString.split("\\s+")
//把整个文件读取成一个字符串

读取二进制文件

scala并没有提供读取二进制文件的方法,你需要使用java类库。

val file = new File(filename)
val in = new FileInputStream(file)
val bytes = new Array[Byte](file.length.toInt)
in.read(bytes)
in.close()

写入文本文件

scala没有内建的对写入文件的支持。可以使用java.io.PrintWriter

val out = new PrintWriter("number.txt")
for(i <- 1 to 100) out.println(i)
out.close()

如果你传递数字给printf函数,编译器会抱怨你传递的不是字符串。可以受用String类的format方法

out.print("%6d %10.2f".format(quantity,price))

访问目录

目前没有正式的用来访问某个目录中的所有文件的类。我们可以自己实现一个:

import java.io.File
def subdirs(dir : File):Iterator[File] = {
val children = dir.listFiles.filter(_.isDirectory)
children.toIterator ++ children.toIterator.flatMap(subdirs _)
}
for(d <- subdirs(dir)) process(d)

正则表达式

scala.util.matching.Regex类是scala的正则表达式引擎。可以用String类的r方法构造一个Regex对象:

val numPattern = "[0-9]+".r
//如果正则表达式包含反斜线或者引号,最好使用""".."""语法
val wsnumwsPattern = """"\s+[0-9]+\s+""".r
  • findAllIn方法返回遍历所有匹配项的迭代器
  • findFirstIn方法返回遍历中首个匹配项,类型是Option[String]
  • replaceAllIn方法替换所有匹配项
  • replaceFirstIn方法替换首个匹配项
val matches = numPattern.findAllIn("99 bottles, 98 bottles").toArray
//Array(99,98)
val m1 = wsnumwsPattern .findFirstIn("99 bottles, 98 bottles")
//Some("98")
numPattern.replaceAllIn("99 bottles, 98 bottles","xx")
//"xx bottles, xx bottles"

正则表达式分组

分组可以让我们方便的获取正则表达式的子式子。

val numitemPattern = "([0-9]+) ([a-z]+)".r
val numitemPattern(num , item) = "99 bottles"
///num 99,item bottles

Comments !