Scala中替换字符串列表元素时如何去除字段前缀别名?
问题描述
我尝试替换字符串列表中的指定字符串,编写了如下Scala代码:
var keys=List("a.SITE", "a.SITEID") var column_expr="coalesce(nullif(SITENAME ,''),'UNKNOWN')" keys = keys.map(element=>element.replace("SITEID",column_expr)) println(keys)
当前输出结果为:
List(a.SITE, a.coalesce(nullif(SITENAME ,''),'UNKNOWN'))
但我期望得到如下结果:
List(a.SITE, coalesce(nullif(SITENAME ,''),'UNKNOWN'))
要求:替换时不保留别名前缀(如a、b、c等任意字符加.的形式),且受逻辑限制,只能传入列名(如SITEID),无法传入带前缀的格式。
解决方案
可以用正则表达式匹配带前缀的目标列名,直接替换成指定表达式,去掉前缀部分。有两种实现方式:
方式一:模式匹配
var keys = List("a.SITE", "a.SITEID") var column_expr = "coalesce(nullif(SITENAME ,''),'UNKNOWN')" keys = keys.map { case elem if elem.matches(".*\\.SITEID") => column_expr case elem => elem } println(keys)
方式二:replaceAll正则替换
var keys = List("a.SITE", "a.SITEID") var column_expr = "coalesce(nullif(SITENAME ,''),'UNKNOWN')" keys = keys.map(elem => elem.replaceAll(".*\\.SITEID", column_expr)) println(keys)
两种方式的核心逻辑都是用.*\.SITEID匹配所有带任意前缀(如a.、b.)的SITEID字符串,直接替换成目标表达式,这样就自动去掉了前缀部分,同时不影响其他元素(比如a.SITE)。
内容的提问来源于stack exchange,提问作者Vikrant Singh Rana
相关产品推荐
相关产品推荐

