Scala中正则匹配id开头列出现意外额外结果问题
问题根因
你写的两个正则本身语义不符合「匹配以id开头的列」的需求,Regexr上返回预期结果只是因为测试用例没有覆盖边界场景,和Scala/Databricks运行环境无关,两个正则的实际匹配逻辑如下:
^id*:正则中*仅修饰紧邻的前一个字符d,规则实际含义为「匹配行首位置,后接字符i,再跟0个或多个d」,所有以i开头的列(比如i、i_age、if_flag)都会被命中,出现额外匹配。^(id)*:正则中*修饰分组(id),规则实际含义为「匹配行首位置,后接0次或多次连续的id字符串」,行首出现0次id等价于匹配任意字符串开头的空串,所有列都会被判定为匹配。
正确方案
匹配所有以id开头的列,正确正则直接写^id即可,如果需要显式匹配id后接任意内容的完整字符串,可写为^id.*。
Databricks Scala(Spark)环境下的参考实现:
// 方案1:直接过滤列名 val targetCols = df.columns.filter(_.matches("^id.*")) // 方案2:用rlike做值匹配/字段筛选 import org.apache.spark.sql.functions.col val matchedDf = df.filter(col("column_name").rlike("^id"))
验证提示:在Regexr平台测试正则时,补充
i、i_user、user_id、_id这类边界测试用例,就能复现你在Scala环境中遇到的额外匹配问题,不存在跨平台正则语法差异。
内容的提问来源于stack exchange,提问作者calep
相关产品推荐
相关产品推荐

