在Scala中的正则表达式后提取元素

时间:2018-02-16 18:04:25

标签: scala spark-dataframe

我在数据框中有一列,其数据如下所示。现在我只需要test1之后的元素

即它应该返回abc,efg,ghg,并且每行的长度也不同。

 test1:abc,test2:ghr,test2:jkl,test1:efg,test3:erp dfg (jfg),test1:ghg

我正在尝试编写一个方法来在test1之后返回部件,我尝试如下。 但它不会完全符合我的预期目标。如果有办法实现它,请告诉我

def findStr(str:String):Array[String]= {
  if (str.contains ("test1:") ) {
  val res = test.split ("test1:")
 for (i <- res.length - 1) {
  val res1 = res (i)
 if (res1.contains (",") ) {
   val res2 = res1.split (",")(0)
    }
  else null
  }
 else null
 }

1 个答案:

答案 0 :(得分:0)

这样做的一种方法:

val input = " test1:abc,test2:ghr,test2:jkl,test1:efg,test3:erp dfg (jfg),test1:ghg"

input
  .split(",")
  // Array(" test1:abc", test2:ghr, test2:jkl, test1:efg, test3:erp dfg (jfg), test1:ghg)
  .map(_.split(":"))
  // Array(Array(" test1", abc), Array(test2, ghr), Array(test2, jkl), Array(test1, efg), Array(test3, erp dfg (jfg)), Array(test1, ghg))
  .filter{ case Array(k, v) => k.trim == "test1" }
  // Array(Array(" test1", abc), Array(test1, efg), Array(test1, ghg))
  .map{ case Array(k, v) => v }
  // Array(abc, efg, ghg)
  .mkString(",")
  // "abc,efg,ghg"

此解决方案假定输入字符串遵循以下格式:

key1:valueA,key2:valueB:key1:valueC,...

由于您拥有由test1分隔的键值结构,而不是在","上拆分,因此您可以拆分为“,”。

这为您提供了一系列键/值字符串,使您可以轻松地单独处理“test1”键。

我认为你去了一个递归函数,你在test1上拆分,它在test1之后直接给你值,你可以用拆分的左边部分再次调用你的函数,以便找到下一个“test1”,依此类推。但我认为在这种情况下这有点过分。

作为旁注,我建议不要在Scala中使用null,而是使用Option monad