Scala技术咨询:如何在文本文件中匹配指定字符串并提取对应句子
解决Scala文本文件中提取含指定字符串的句子问题
我来帮你搞定这个需求~你当前的代码之所以会返回整个文件内容,是因为两个关键问题:
- 用
mkString把所有行直接合并成了一个大字符串,丢失了句子的边界信息 filter的逻辑写错了,你现在是判断整个文件内容是否包含目标字符串,只要有一处匹配就会把整个文本返回,而不是筛选单个句子
下面是具体的解决思路和代码示例:
步骤1:正确分割文本为句子
首先得把整个文本拆分成一个个独立的句子。英文句子通常以.、!、?结尾,后面可能跟着空格或换行,我们可以用正则表达式来匹配这些分隔符:
val sentencePattern = """(?<=[.!?])\s+""".r // 匹配句子结尾符后的空白字符作为分隔符
这个正则的意思是:匹配那些紧跟在./!/?后面的一个或多个空白字符(空格、换行等),用它来分割句子可以保留句子本身的结尾符号。
步骤2:读取文件并筛选目标句子
接下来读取文件内容,分割成句子列表,然后过滤出包含指定字符串的句子:
import scala.io.Source object SentenceSearch { def main(args: Array[String]): Unit = { val targetString = "string to search" // 你要搜索的目标字符串 val filePath = "/Users/sc/Documents/Scala_Code/input.txt" // 读取文件所有内容并合并成一个字符串 val fileContents = Source.fromFile(filePath).mkString // 分割成句子列表 val sentences = sentencePattern.split(fileContents) // 过滤出包含目标字符串的句子(大小写敏感) val matchedSentences = sentences.filter(_.contains(targetString)) // 打印结果 matchedSentences.foreach(println) } }
额外优化:忽略大小写匹配
如果需要忽略大小写来搜索,可以把判断条件改成:
val matchedSentences = sentences.filter(_.toLowerCase.contains(targetString.toLowerCase))
处理大文件的注意事项
如果你的文件非常大,一次性读入全部内容可能会占用较多内存。这时候可以逐行处理,先把每行拆分成句子,再过滤:
val matchedSentences = Source.fromFile(filePath) .getLines() .flatMap(line => sentencePattern.split(line)) // 把每行拆分成句子 .filter(_.contains(targetString)) .toList
这样就能精准提取出所有包含目标字符串的句子啦~
内容的提问来源于stack exchange,提问作者DW_BD
相关产品推荐
相关产品推荐

