从文件读取时匹配 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
将包含所有找到的匹配项。
用于处理包含 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
将包含所有找到的匹配项。