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

时间:2014-05-26 15:42:18

标签: regex string scala dynamic

对Scala来说有些新鲜,但它不是我的第一个编程牛仔竞技表演。我正在读取一个文件,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转换为字符串,char等。没有运气。我想发出如下命令:

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不是Option [Sequence]

的成员

当我创建一个变量foo =&#34;&#34;&#34;&#34;&#34;&#34; .r它在println语句中被评估为好。

好的,这里的解决方案如下:

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

感谢reggert和cdshines的帮助和见解!

2 个答案:

答案 0 :(得分:2)

Scala不是一种动态语言,但您似乎试图通过尝试将字符串作为Scala代码来对待它,只能通过在代码中实例化解释器来实现这一点(这样做太复杂了)你想做什么)。

这样做:

val allRegex = eRegex.r

这将为您提供Regex类的实例。请参阅此类的文档,以了解如何使用它来对要搜索的字符串进行模式匹配。

答案 1 :(得分:0)

目前尚不清楚你的问题究竟是什么,但我想这就像error: value findAll is not a member of String。我是对的吗?

问题是,您正在将".r"附加到正则表达式本身,而不是在.r实例上调用String。看:

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

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