正则表达式:移除文件名最后下划线与扩展名间的内容
解决文件名中移除最后一个下划线与扩展名之间内容的正则问题
嘿,我明白你要做什么了——就是把文件名里最后一个下划线到扩展名前面的那串内容删掉对吧?你之前用的正则/[^_]+(?=\.)/差一点就对了,但问题出在它没把那个多余的下划线包含进来,所以替换后才会留下first_.png这种结果。
正确的正则表达式
直接用这个正则匹配要删除的部分,然后替换为空字符串就行:
/_[^_.]+(?=\.)/
正则逻辑拆解
_:精准匹配目标下划线(也就是文件名里最后一个分隔用的下划线)[^_.]+:匹配下划线后面既不是下划线也不是点的所有字符——这部分就是你想删掉的冗余内容(比如01、02)(?=\.):正向预查规则,确保我们匹配的内容后面紧跟着扩展名的起始点,避免误伤到文件名里其他的点或下划线。
示例代码(以JavaScript为例)
// 测试用文件名数组 const testFilenames = ["first_01.png", "second_file_02.png", "report_2024.tar.gz"]; // 执行替换处理 const cleanedFilenames = testFilenames.map(filename => filename.replace(/_[^_.]+(?=\.)/, '') ); console.log(cleanedFilenames); // 输出结果: ["first.png", "second_file.png", "report.tar.gz"]
原正则问题分析
你之前用的/[^_]+(?=\.)/只会匹配点前面的非下划线字符(比如01、02),替换之后,原来的下划线还留在文件名里,所以才会得到first_.png这种不符合预期的结果。我们只需要把那个下划线也加入到匹配范围里,就能一次性把它和后面的冗余内容一起删掉啦。
内容的提问来源于stack exchange,提问作者trapczyk




