簡體   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