用Scala构建动态正则表达式

holgip5t  于 2023-01-20  发布在  Scala
关注(0)|答案(3)|浏览(126)

我对Scala有些陌生,但这不是我第一牛仔竞技表演编程。我从一个文件中阅读要应用于数据库的Regex命令。我动态构建regex如下:

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,如果我将其剪切/粘贴到一个静态变量中-所有工作。
更多代码如下:

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(","))***

我仍然收到相同的错误:值FindAllIn不是选项[序列]的成员
当我创建一个变量foo =“""".r时,它在println语句中得到了很好的求值。
好的,解决方案如下:

val allRegex = eRegex.r.findAllIn(impression).mkString(",")
       println(allRegex)

感谢reggert和cdshines的帮助和洞察力!

lsmd5eda

lsmd5eda1#

Scala不是一种动态语言,但您似乎试图将其视为动态语言,试图将字符串作为Scala代码来计算,而这只能通过在代码中示例化解释器来实现(这对于您想要做的事情来说太复杂了)。
就这么办吧:

val allRegex = eRegex.r

这将给你一个Regex类的示例。参考这个类的文档来找出如何使用它来对你想要搜索的字符串进行模式匹配。

bjp0bcyl

bjp0bcyl2#

不清楚你的问题到底是什么,但我猜是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

我希望你能从这里推导出正确的解决方案。如果你想要更具体的东西,分享一些具体的代码+错误片段。

dly7yett

dly7yett3#

目前还不清楚你的问题到底是什么,但如果你想使用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

相关问题