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

Scala中Regex replaceAll如何替换所有匹配的正则分组

问题原因

正则写法的核心错误是误用了字符集规则:

  • [UNIQUE\s]属于单字符匹配规则,只会匹配U、N、I、Q、E、空白符中的任意1个字符,完全无法匹配完整的UNIQUE单词
  • 后续的{0,1}表示该单字符规则最多匹配1次,因此碰到UNIQUE PRIMARY开头的字符串时,仅会匹配UNIQUE后面的1个空格,前面的UNIQUE单词根本没被纳入匹配范围,替换后就会出现UNIQUEPRIMARY KEY的拼接错误。
修正方案

将可选匹配UNIQUE前缀的逻辑从字符集改为非捕获分组,修正后的正则为:

(?:UNIQUE\s+)?PRIMARY INDEX\s+\S+\s+\(

规则说明:

  • (?:UNIQUE\s+)?:非捕获分组,匹配0次或1次UNIQUE单词+后续至少1个空白符,同时兼容带/不带UNIQUE前缀的两种SQL场景
  • PRIMARY INDEX:精确匹配固定关键词
  • \s+\S+\s+:匹配索引名及其前后的空白,兼容存在多空格的不规范SQL写法
  • \(:匹配索引定义前的左括号
测试验证

不带UNIQUE前缀场景

var line = "PRIMARY INDEX XPKDLRSRC_PMT_CLMPMT ( DLRSRC_PMT_ID ,DLRSRC_PMT_CLMPMT_ID );"
println(line.replaceAll(/(?:UNIQUE\s+)?PRIMARY INDEX\s+\S+\s+\(/, "PRIMARY KEY ("))

运行输出:

PRIMARY KEY ( DLRSRC_PMT_ID ,DLRSRC_PMT_CLMPMT_ID );

带UNIQUE前缀场景

line = "UNIQUE PRIMARY INDEX XPKDLRSRC_PMT_CLMPMT ( DLRSRC_PMT_ID ,DLRSRC_PMT_CLMPMT_ID );"
println(line.replaceAll(/(?:UNIQUE\s+)?PRIMARY INDEX\s+\S+\s+\(/, "PRIMARY KEY ("))

运行输出:

PRIMARY KEY ( DLRSRC_PMT_ID ,DLRSRC_PMT_CLMPMT_ID );

两种场景输出均符合预期。

内容的提问来源于stack exchange,提问作者Lars Skaug

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 07:15:32