我需要一个正则表达式,可以删除文件名的扩展名,仅返回文件名。
以下是一些输入和输出的示例:
myfile.png -> myfile
myfile.png.jpg -> myfile.png
我显然可以手动执行此操作(即删除最后一个点中的所有内容),但我确信有一个正则表达式可以自行执行此操作。
仅供记录,我正在 JavaScript 中执行此操作
为了完整起见:如果没有正则表达式,如何实现这一点?
var input = 'myfile.png';
var output = input.substring(0, input.lastIndexOf('.')) || input;
|| input
负责处理这种情况,其中 lastIndexOf()
提供 -1
。你看,这仍然是一句台词。
/(.*)\.[^.]+$/
结果将位于第一个捕获组中。然而,只找到最右边句点的位置,然后获取它之前的所有内容,而不使用正则表达式,可能会更有效。
匹配模式的正则表达式是:
/\.[^.]*$/
它找到一个句点字符 (\.),后跟 0 个或多个非句点字符 ([^.]*),最后是字符串结尾 ($)。
console.log(
"aaa.bbb.ccc".replace(/\.[^.]*$/,'')
)
/^(.+)(\.[^ .]+)?$/
此方法有效而其他方法失败的测试用例:
上面的共同点当然是“格式错误”的文件扩展名。但你总是必须考虑那些极端情况。 :P
失败的测试用例:
如何处理这些问题是有问题的,最好根据项目的具体情况来决定。
/^(.+)(\.[^ .]+)?$/
上面的模式是错误的 - 它总是包含扩展名。这是因为 javascript 正则表达式引擎的工作方式。
(\.[^ .]+)
标记是可选的,因此引擎将成功将整个字符串与 (.+)
匹配
http://cl.ly/image/3G1I3h3M2Q0M
这是我经过测试的正则表达式解决方案。
该模式将匹配路径中带/不带扩展名的 filenameNoExt,同时考虑斜杠和反斜杠分隔符
var path = "c:\some.path/subfolder/file.ext"
var m = path.match(/([^:\\/]*?)(?:\.([^ :\\/.]*))?$/)
var fileName = (m === null)? "" : m[0]
var fileExt = (m === null)? "" : m[1]
对上述模式的剖析:
([^:\\/]*?) // match any character, except slashes and colon, 0-or-more times,
// make the token non-greedy so that the regex engine
// will try to match the next token (the file extension)
// capture the file name token to subpattern \1
(?:\. // match the '.' but don't capture it
([^ :\\/.]*) // match file extension
// ensure that the last element of the path is matched by prohibiting slashes
// capture the file extension token to subpattern \2
)?$ // the whole file extension is optional
http://cl.ly/image/3t3N413g3K09
http://www.gethifi.com/tools/regex
这将涵盖@RogerPate提到的所有情况,但也包括完整路径
另一种无正则表达式的方法(@Rahul 版本的“相反”,不使用 pop() 来删除)
不需要两次引用变量,因此更容易内联
filename.split('.').slice(0,-1).join()
这也可以做到:)
'myfile.png.jpg'.split('.').reverse().slice(1).reverse().join('.');
不过我会坚持使用正则表达式...=P
return filename.split('.').pop();
它会让你的愿望成真。但不是正则表达式方式。
在 javascript 中,您可以调用 Replace() 方法,该方法将根据正则表达式进行替换。
此正则表达式将匹配从行首到行尾的所有内容,并删除最后一个句点(包括句点)之后的所有内容。
/^(.*)\..*$/
如何实现替换可以在这个 Stackoverflow 问题中找到。