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

如何在JavaScript中使用RegExp分组解析字符串并去除版本后缀

解决字符串末尾版本标识的正则解析问题

要移除字符串末尾-数字或_数字格式的版本标识、保留主体内容,可以通过两种正则思路实现:

方案1:直接替换末尾版本后缀

这是最直接的实现方式——用正则匹配末尾的版本标识并替换为空:

正则表达式:/[-_]\d+$/

  • [-_]:匹配-或_分隔符
  • \d+:匹配一个或多个数字(覆盖单/多位数版本场景)
  • $:限定匹配范围为字符串末尾

TypeScript代码示例:

const testSet: string[] = [
    "alpha-4181a",
    "alpha-4181a-2",
    "alpha-4181a_3",
    "example",
    "smokeTest"
];

const returnSet = testSet.map(str => str.replace(/[-_]\d+$/, ''));

console.log(returnSet);
// 输出结果:
// ["alpha-4181a", "alpha-4181a", "alpha-4181a", "example", "smokeTest"]

如果需要支持连续多层版本(比如alpha-4181a-2_3),可将正则改为/([-_]\d+)+$/,一次性移除所有末尾连续的版本标识。

方案2:分组捕获主体内容

通过捕获组提取版本标识之前的主体部分,适合需要单独获取主体和版本的场景:

正则表达式:/^(.*?)(?:[-_]\d+)?$/

  • ^:匹配字符串起始位置
  • (.*?):非贪婪捕获主体内容(避免误匹配主体内部的-_字符)
  • (?:[-_]\d+)?:非捕获组,匹配可选的末尾版本标识;?确保无版本的字符串也能正常捕获主体
  • $:匹配字符串结束位置

TypeScript代码示例:

const returnSet = testSet.map(str => {
  const matchResult = str.match(/^(.*?)(?:[-_]\d+)?$/);
  // 匹配失败时返回原字符串,避免报错
  return matchResult ? matchResult[1] : str;
});

原正则的问题说明

你之前使用的/([-_]\d?)$/gi存在几个局限:

  • \d?仅匹配0或1个数字,无法覆盖多位数版本(如-123)
  • 全局标识g无意义,因为只需要匹配末尾一次
  • 仅捕获版本部分,未设计主体内容的捕获逻辑,因此无法直接提取目标字符串

内容的提问来源于stack exchange,提问作者Austin Hallett

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 16:05:33