用于匹配/提取文件扩展名的 Javascript 正则表达式

新手上路,请多包涵

以下正则表达式

var patt1=/[0-9a-z]+$/i;

提取字符串的文件扩展名,例如

filename-jpg
filename#gif
filename.png

如何修改此正则表达式以仅在字符串确实是一个以一个点作为分隔符的文件名时返回扩展名? (显然 filename#gif 不是常规文件名)

更新基于 tvanofsson 的评论,我想澄清一下,当 JS 函数接收到字符串时,该字符串将已经包含一个没有空格、没有点和其他特殊字符的文件名(实际上将被处理为 slug ) .问题不在于解析文件名,而在于错误地解析 slugs - 当函数被赋予“filename-jpg”时,函数返回了“jpg”的扩展名,而实际上它应该返回 null 或空字符串,它是这种行为需要纠正。

原文由 mare 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

只需将 . 添加到正则表达式

var patt1=/\.[0-9a-z]+$/i;

因为点是正则表达式中的特殊字符,所以您需要将其转义以按字面意思匹配它: \.

您的模式现在将匹配任何以点结尾且后跟 [0-9a-z] 中的至少一个字符的字符串。

例子:

 [
  "foobar.a",
  "foobar.txt",
  "foobar.foobar1234"
].forEach( t =>
  console.log(
    t.match(/\.[0-9a-z]+$/i)[0]
  )
)

如果您还想将扩展名限制为一定数量的字符,那么您需要替换 +

 var patt1=/\.[0-9a-z]{1,5}$/i;

点后至少允许 1 个字符,最多 5 个字符。

原文由 stema 发布,翻译遵循 CC BY-SA 4.0 许可协议

尝试

var patt1 = /\.([0-9a-z]+)(?:[\?#]|$)/i;

此正则表达式可用于从 URL 中提取文件扩展名 - 即使是具有 ?foo=1 查询字符串和 #hash 结尾的文件扩展名。

它还将为您提供扩展名 $1

 var m1 = ("filename-jpg").match(patt1);
alert(m1);  // null

var m2 = ("filename#gif").match(patt1);
alert(m2);  // null

var m3 = ("filename.png").match(patt1);
alert(m3);  // [".png", "png"]

var m4 = ("filename.txt?foo=1").match(patt1);
alert(m4);  // [".txt?", "txt"]

var m5 = ("filename.html#hash").match(patt1);
alert(m5);  // [".html#", "html"]

@stema 的 PS +1,他就所涉及的一些 RegExp 语法基础 提供了很好的建议

原文由 Már Örlygsson 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题