我需要一个可以删除文件名扩展名的正则表达式,只返回文件名。
以下是输入和输出的一些示例:
myfile.png -> myfile
myfile.png.jpg -> myfile.png
我显然可以手动执行此操作(即从最后一个点删除所有内容),但我确信有一个正则表达式可以自行完成。
仅供记录,我在JavaScript中执行此操作
答案 0 :(得分:80)
为了完整性:如果没有正则表达式,如何实现这一目标?
var input = 'myfile.png';
var output = input.substr(0, input.lastIndexOf('.')) || input;
|| input
负责处理lastIndexOf()
提供-1
的情况。你看,它仍然是一个单行。
答案 1 :(得分:38)
/(.*)\.[^.]+$/
结果将在第一个捕获组中。但是,在不使用正则表达式的情况下,找到最右边的位置然后将所有内容放在它之前可能更有效。
答案 2 :(得分:11)
/^(.+)(\.[^ .]+)?$/
测试用例有效,其他测试用例失败:
上面的共同主题当然是“格式错误”的文件扩展名。但你总是要考虑那些极端情况。 :P
失败的测试用例:
如何处理这些是有问题的,最好根据项目特定的方式决定。
答案 3 :(得分:4)
匹配模式的正则表达式为:
/\.[^.]*$/
找到一个句点字符( \。),后跟0个或更多不是句点的字符( [^。] * ),然后是结尾字符串( $ )。
答案 4 :(得分:4)
/^(.+)(\.[^ .]+)?$/
以上模式错误 - 它也将始终包含扩展名。这是因为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提及的所有案例,但也包括完整路径
答案 5 :(得分:3)
另一种非正则表达方式("对话" @ Rahul' s版本,不使用pop()删除)
它不需要两次引用变量,因此内联更容易
filename.split('.').slice(0,-1).join()
答案 6 :(得分:0)
这也可以:)
'myfile.png.jpg'.split('.').reverse().slice(1).reverse().join('.');
我坚持使用正则表达式但是...... = P
答案 7 :(得分:0)
return filename.split('.').pop();
它会让你的愿望成真。但不是正则表达方式。
答案 8 :(得分:-2)
在javascript中,您可以调用将根据正则表达式替换的Replace()方法。
这个正则表达式将匹配从行的开头到结尾的所有内容,并删除包括句点在内的最后一个句点之后的任何内容。
/^(.*)\..*$/
可以在Stackoverflow问题中找到实现替换的方法。