从文件读取时匹配 Scala 正则表达式中的新行

matching new line in Scala regex, when reading from file

用于处理包含 SQL 语句的文件,例如:

ALTER TABLE ONLY the_schema.the_big_table
    ADD CONSTRAINT the_schema_the_big_table_pkey PRIMARY KEY (the_id);

我正在使用正则表达式:

 val primaryKeyConstraintNameCatchingRegex: Regex = "([a-z]|_)+\.([a-z]|_)+\n\s*(ADD CONSTRAINT)\s*([a-z]|_)+\s*PRIMARY KEY”.r

现在的问题是这个正则表达式没有return任何结果,尽管正则表达式

val alterTableRegex = “ALTER TABLE ONLY\s+([a-z]|_)+\.([a-z]|_)+”.r

val addConstraintRegex = “ADD CONSTRAINT\s*([a-z]|_)+\s*PRIMARY KEY”.r

匹配预期的序列。

我认为问题可能出在新行上,到目前为止,我已经尝试编写 \s+\W+\s*\W*、[ =21=、\n*\n+\r+\r*\r\s*\n*\s*\s*\n*\s*等组合匹配 table 名称和 add constraint 之间的白色 space 无济于事。

如有任何帮助,我将不胜感激。

编辑

这是我使用的代码:

import scala.util.matching.Regex
import java.io.File

import scala.io.Source


object Hello extends Greeting with App {

  val primaryKeyConstraintNameCatchingRegex: Regex = "([a-z]|_)+\.([a-z]|_)+\r\s*(ADD CONSTRAINT)\s*([a-z]|_)+\s*PRIMARY KEY".r


  readFile

  def readFile: Unit = {
    val fname = "dump.sql"
    val fSource = Source.fromFile(fname)


    for (line <- fSource.getLines) {
      val matchExp = primaryKeyConstraintNameCatchingRegex.findAllIn(line).foreach(
        segment => println(segment)
      )
    }

    fSource.close()


  }
}

编辑 2

另一个奇怪的行为是当与

匹配时
"""[a-z_]+(\.[a-z_]+)\s*A""”.r

匹配发生了,它们包括 A,但是当我使用

"""[a-z_]+(\.[a-z_]+)\s*ADD""”.r

DD不同,没有序列匹配。

您的问题是您逐行读取文件(参见 for (line <- fSource.getLines) 代码部分)。

您需要将内容抓取为单个字符串才能匹配换行符。

val fSource = Source.fromFile(fname).mkString
val matchExps = primaryKeyConstraintNameCatchingRegex.findAllIn(fSource)

现在,fSource 将包含整个文本文件内容作为一个字符串,matchExps 将包含所有找到的匹配项。