将正则表达式应用于Scala中的源文件

时间:2016-06-07 20:36:58

标签: regex scala

我有一些.txt文件,我想在使用前清理。虽然我不是正则表达式的新手,但我是Scala的新手。我写了一个简短的方法,它应该删除所有“\ n”换行符标记并用空格替换它们,但是当我运行我的函数时,所有的“\ n”仍然存在。谁能抓住我做错了什么?

// Scala 2.11.8
import scala.io.Source
import scala.util.matching.Regex


def cleanText(filename: String) {
  val pattern = "\\n".r
  for(line <- Source.fromFile(filename).getLines())
    println(pattern replaceAllIn(line, " "))
    //println (line.getClass) //String
}

cleanText("22453117_1.txt")  

正如您所看到的,我正在遍历文件的行并要求它用空格替换“\ n”。这是我的文本文件中的一个片段:

  

['\ n Mucormycoses是由古代引起的真菌感染   毛霉目。它们很少见,但却越来越少。诱发   支持和支持\ nhumans和动物中的粘膜霉菌的条件   包括糖尿病酮症酸中毒',....

当我println(line)时,无论有没有正则表达式replaceAllIn,我都会得到相同的结果。

我认为可能会阻碍的一点是Scala是否将此文件作为一个字符串开始读取,或者是多少字符串。如您所见,我试图用

进行测试
println(line.getClass)

只返回“String”,但我仍然不确定我是在处理多个字符串还是一个大字符串。无论哪种方式,我的正则表达式replaceAllIn()应该有效,不是吗?有没有更好的方法来确定我是在处理许多字符串还是只处理一个字符串?这甚至在这里重要吗?

此外,如果它有助于您了解,我的编码背景是Python,我不知道任何Java。因此,我发现Scala非常难以接受,因为大多数教程试图用Java来解释Scala概念。

1 个答案:

答案 0 :(得分:0)

如果要替换字符串"\n"(不是换行符,而是字符串'\''n'),您也应该使用反斜杠。

scala> val text = "\\nHello\\nWorld!"
text: String = \nHello\nWorld!

scala> val pattern = "\\n".r
pattern: scala.util.matching.Regex = \n

上述代码(逻辑上与您的代码相同)不会替换"\n",因为pattern正在尝试查找\n(换行符)。

如果您也在模式中转义\,就像在下面的代码中一样,您可以替换字符串中的“\ n”文本。

scala> pattern replaceAllIn(text, " ")
res0: String = \nHello\nWorld!

scala> val pattern2 = "\\\\n".r
pattern2: scala.util.matching.Regex = \\n

scala> pattern2 replaceAllIn(text, " ")
res1: String = " Hello World!"

但是如果你使用replaceAll方法,那么你不需要单独定义一个模式。

scala> text.replaceAll("\\\\n", " ")
res2: String = " Hello World!"

或者@ som-snytt提到,你也可以使用text.replaceAllLiterally

scala> text.replaceAllLiterally("""\n""", " ")
res3: String = " Hello World!"