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+数字得字符串。