繁体   English   中英

使用 Scala 构建动态正则表达式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM