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