You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Node.js中驼峰式单词转连字符分隔的正则适配求助

转换驼峰式拆分正则到JavaScript的解决方案

我明白你遇到的问题——Perl的正则依赖后瞻断言,而早期JavaScript不支持,但现在我们有两种可行的方案,既能匹配你的需求,又能在JS里正常运行:

方案1:使用ES2018+后瞻断言(简洁直接)

现代浏览器和Node.js(10+)已经支持肯定后瞻断言,我们可以直接把Perl的逻辑转换过来,还补充了数字的处理(适配OAuth2Scopes这类带数字的场景):

function splitCamelCase(str) {
  // 匹配所有需要拆分的位置
  const splitRegex = /(?<=[a-z0-9])(?=[A-Z])(?!ID)|(?<=ABC)|(?<=API)(?=[A-Z])|(?=Connect)/;
  return str.split(splitRegex).join('-').toLowerCase();
}

// 测试你的示例
console.log(splitCamelCase('InstallAndSetup')); // 输出: install-and-setup
console.log(splitCamelCase('DeployingABCDefGhijk')); // 输出: deploying-abc-def-ghijk
console.log(splitCamelCase('OpenIDConnect')); // 输出: openid-connect
console.log(splitCamelCase('OAuth2Scopes')); // 输出: oauth2-scopes
console.log(splitCamelCase('APISecurity')); // 输出: api-security

正则逻辑说明:

  • (?<=[a-z0-9])(?=[A-Z])(?!ID):匹配小写/数字后接大写字母的位置,但排除大写字母是I且后续是D的情况(保证OpenID不被拆分)
  • (?<=ABC):在ABC字符串后插入拆分点
  • (?<=API)(?=[A-Z]):仅当API后面跟着大写字母时才拆分(避免API本身被拆分)
  • (?=Connect):在Connect字符串前插入拆分点

方案2:兼容旧环境(无需后瞻断言)

如果你需要支持ES2018之前的环境,可以用replace方法模拟拆分逻辑,通过插入分隔符来实现:

function splitCamelCaseLegacy(str) {
  // 1. 在Connect前添加分隔符
  str = str.replace(/Connect/g, '-$&');
  // 2. 在ABC后(接大写字母时)添加分隔符
  str = str.replace(/ABC(?=[A-Z])/g, '$&-');
  // 3. 在API后(接大写字母时)添加分隔符
  str = str.replace(/API(?=[A-Z])/g, '$&-');
  // 4. 在小写/数字后接大写字母(且不是ID开头)时添加分隔符
  str = str.replace(/([a-z0-9])([A-Z])(?!ID)/g, '$1-$2');
  
  return str.toLowerCase();
}

// 同样测试你的示例,结果一致
console.log(splitCamelCaseLegacy('OpenIDConnect')); // openid-connect
console.log(splitCamelCaseLegacy('APISecurity')); // api-security

这个方案通过分步替换,避免了后瞻断言的依赖,兼容性更广。

内容的提问来源于stack exchange,提问作者Shani Ranasinghe

火山引擎 最新活动