如何仅用正则表达式将文件名拆分为主体与后缀两个部分
解决方案
你可以使用以下正则实现需求:
const myRegex = /^(.*?)(?:\.([^.]+))?$/
规则说明
- 第一捕获组
(.*?)采用懒惰匹配模式,会配合后面的结束规则自动截断到最后一个.的前一位 - 中间的
(?:\.([^.]+))?是可选的非捕获组,仅当存在后缀时触发:匹配最后一个.,同时将后续所有非.的内容作为第二捕获组(即后缀) - 如果文件名没有
.,整个字符串会全部归入第一捕获组,第二捕获组返回undefined,你可以根据需要用|| ''转为空字符串。
测试用例
// 多段点的文件名 const [, filename1, extension1] = 'foo.baz.bing.bong'.match(myRegex) ?? [] // filename1: 'foo.baz.bing' | extension1: 'bong' // 单段点的文件名 const [, filename2, extension2] = 'one.two'.match(myRegex) ?? [] // filename2: 'one' | extension2: 'two' // 无后缀的文件名 const [, filename3, extension3] = 'noextension'.match(myRegex) ?? [] // filename3: 'noextension' | extension3: undefined
如果你希望无后缀场景下第二组直接返回空字符串,可以调整正则为:
const myRegex = /^(.*?)(?:\.([^.]+)|)$/
内容的提问来源于stack exchange,提问作者AncientSwordRage
相关产品推荐
相关产品推荐

