[英]Building dynamic Regex using Scala
我对 Scala 有点陌生,但这不是我的第一个编程牛仔竞技表演。 我正在从文件中读取要应用于数据库的正则表达式命令。 我按如下方式动态构建正则表达式:
var valueRegex = new StringBuilder
var eRegex = z(3).toString() // comes from the third column in the file I am reading into the program.
valueRegex ++= "\"\"\" "
valueRegex ++= eRegex
valueRegex ++= " \"\"\""
valueRegex ++= ".r"
var allRegex = valueRegex
我试过将 valueRegex 转换为字符串、字符等。没有运气。 我只想按如下方式发出此命令:
println((allRegex findAllIn impression).mkString(",")) // impression field in DB.
它正在正确打印 allRegex,如果我将其剪切/粘贴到 static 变量中 - 一切正常。
更多代码如下:
var eRegex = None: Option[String]
var valueRegex = new StringBuilder
var allRegex = None: Option[CharSequence]
for (a <- z) {
if ( z(3).isEmpty() ) {
var eRegex : String = (z(0))
valueRegex ++= "\"\"\""
valueRegex ++= eRegex
valueRegex ++= "\"\"\""
valueRegex ++= ".r"
// var allRegex = valueRegex
val allRegex = eRegex.r
println(allRegex)
// println(eRegex)
} else {
var eRegex = z(3).toString()
valueRegex ++= "\"\"\" "
valueRegex ++= eRegex
valueRegex ++= " \"\"\""
valueRegex ++= ".r"
// var allRegex = valueRegex
val allRegex = eRegex.r
println(allRegex)
}
println("Record ID: " + id + "\n")
***println((allRegex findAllIn impression).mkString(","))***
我仍然遇到同样的错误:value FindAllIn is not a member of Option[Sequence]
当我创建一个变量 foo = """""".r 时,它在 println 语句中得到了很好的评估。
好的,这里是解决方案如下:
val allRegex = eRegex.r.findAllIn(impression).mkString(",")
println(allRegex)
感谢 reggert 和 cdshines 的帮助和见解!
Scala不是动态语言,但是您似乎试图通过将字符串评估为Scala代码来对待它,这只能通过在代码中实例化解释器来完成(这对于您想要的而言太复杂了)去做)。
只要这样做:
val allRegex = eRegex.r
这将为您提供Regex类的实例。 请查阅该类的文档,以了解如何使用它对要搜索的字符串进行模式匹配。
目前尚不清楚您的问题到底是什么,但是我想这有点像error: value findAll is not a member of String
。 我对吗?
事实是,您将".r"
附加到正则表达式本身,而不是在String
实例上调用.r
。 看:
scala> val vr = """\s.r"""
vr: String = \s.r
scala> vr findAllIn " "
<console>:9: error: value findAllIn is not a member of String
vr findAllIn " "
^
scala> val vr = """\s""".r
vr: scala.util.matching.Regex = \s
scala> vr findAllIn " "
res2: scala.util.matching.Regex.MatchIterator = non-empty iterator
希望您可以从这里推断出正确的解决方案。 如果您想要更具体的内容,请共享一些具体的代码和错误代码段。
目前尚不清楚您的问题到底是什么,但如果您想使用 Scala 构建动态正则表达式,则字符串插值可能会有所帮助,例如:
val x = "abc" // this could be dynamic
val pattern = s"^$x([0-9]{4})-([0-9]{2})-([0-9]{2})$$".r
pattern.findAllMatchIn("abc2022-01-19").foreach(x=>println(x))
印刷
abc2022-01-19
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.