我需要一个可以删除文件名扩展名的正则表达式,只返回文件名。
以下是输入和输出的一些示例:
myfile.png -> myfile
myfile.png.jpg -> myfile.png
我显然可以手动执行此操作(即从最后一个点中删除所有内容),但我确信有一个正则表达式可以自行完成此操作。
只是为了记录,我在 JavaScript 中这样做
我需要一个可以删除文件名扩展名的正则表达式,只返回文件名。
以下是输入和输出的一些示例:
myfile.png -> myfile
myfile.png.jpg -> myfile.png
我显然可以手动执行此操作(即从最后一个点中删除所有内容),但我确信有一个正则表达式可以自行完成此操作。
只是为了记录,我在 JavaScript 中这样做
只是为了完整性:如果没有正则表达式怎么能做到这一点?
var input = 'myfile.png';
var output = input.substr(0, input.lastIndexOf('.')) || input;
在|| input
需要的情况下,这里的护理lastIndexOf()
提供-1
。你看,它仍然是一个单线。
/(.*)\.[^.]+$/
结果将在第一个捕获组中。但是,不使用正则表达式,只找到最右边的时间段的位置,然后在它之前的所有内容,可能更有效。
/^(.+)(\.[^ .]+)?$/
这有效而其他失败的测试用例:
当然,上面的共同点是“格式错误”的文件扩展名。但是你总是要考虑那些极端情况。:P
失败的测试用例:
如何处理这些是有问题的,最好根据项目特定的基础来决定。
匹配模式的正则表达式是:
/\.[^.]*$/
它找到一个句点字符 ( \. ),后跟 0 个或多个不是句点的字符 ( [^.]* ),然后是字符串的结尾 ( $ )。
console.log(
"aaa.bbb.ccc".replace(/\.[^.]*$/,'')
)
/^(.+)(\.[^ .]+)?$/
上面的模式是错误的 - 它也总是包含扩展名。这是因为 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 提到的所有情况,但也包括完整路径