spark正则表达式提取字符串内容案例

linux | 2021-04-29 10:36:59

spark正则表达式提取匹配到的字符后面的数字

比如有两个字段的表

rule answer
A2AB3 A
B3AB4ABC6 AB

我要得出answer对应rule后面的分数

def extractScoreFromRule(): Column = {
    var column=regexp_extract(//提取字符串后面的数字
      //再次替换正则(正则是没有包含answer及后面数字的),就只剩下了answer这个字符串及后面的数字
      regexp_replace($"rule",
        concat(//组成一个正则是没有包含answer及后面数字的
          lit("^"),
          regexp_replace(//把answer对应的字符和数字替换成|
            $"score_rule",
            //把答案拼接进正则表达式中,匹配的是answer这个字符串及后面的数字,但前面不能是字母,所以能精确匹配到多选单选
            concat(lit("(?<![A-Z])"), col("answer"), lit("((\\d+\\.\\d+)|(\\d+))")),
            lit("|")
          )
        ),
        lit("")
      )
      , "((\\d+\\.\\d+)|(\\d+))"
      , 1
    )

    column=when(column==="",0d).otherwise(column)
    column.cast(DoubleType)
  }

其实绕了一个圈是因为regexp_extract这个函数不能直接按column提取,只能按常量提取。所以只能先得到answer+数字得字符串。

登录后即可回复 登录 | 注册
    
关注编程学问公众号