You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 10:24:22