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




