下面的正则表达式
var patt1=/[0-9a-z]+$/i;
提取字符串的文件扩展名,例如
filename-jpg
filename#gif
filename.png
如何修改这个正则表达式,使其只在字符串确实是以一个点作为分隔符的文件名时返回扩展名?(显然,filename#gif不是一个常规文件名)
- UPDATE基于tvanofsson的注解,我想澄清一下,当JS函数接收到字符串时,该字符串将已经包含一个没有空格、没有点和其他特殊字符的文件名(实际上是
slug
处理的)问题不在于解析文件名,而在于错误地解析了slugs --函数在给定“filename-jpg”时返回扩展名“jpg”当它实际上应该返回null
或空字符串时,需要纠正这种行为。*
6条答案
按热度按时间qvsjd97n1#
只需向正则表达式中添加一个
.
因为点在regex中是一个特殊字符,所以需要对其进行转义以匹配其字面含义:
\.
.现在,您的模式将匹配
[0-9a-z]
中以点结尾且后跟至少一个字符的任何字符串。示例:
如果您还想将扩展名限制为一定数量的字符,则需要替换
+
将允许在点后至少有1个字符,最多有5个字符。
piwo6bdm2#
试试看
这个RegExp对于从URL中提取文件扩展名非常有用-即使是那些具有
?foo=1
查询字符串和#hash
结尾的URL。它还将为您提供扩展名
$1
。P.S.+1 for @stema,他就所涉及的一些RegExp语法基础提供了很好的建议。
jdgnovmf3#
示例列表:
Test page .
vfh0ocws4#
一行:
上述解决方案包括链接。它采用最后一个点和第一个“
?
“或“#
“字符或字符串结尾之间的所有内容。要忽略“?
“和“#
“字符,请使用/\.([^.]*)$/
。要仅忽略“#
“,请使用/\.([^.]*?)(?=\?|$)/
。示例4xy9mtcn5#
我在O'Reilly Regular Expressions Cookbook上找到了这个解决方案(第8章,第24节),它不区分大小写,可以与.NET,Java,JavaScript,PCRE,Perl,Python和Ruby一起使用。
文件扩展名必须以点开始,因此,我们在正则表达式的开头加上了。
像Version 2.0.txt这样的文件名可能包含多个点。最后一个点是文件名和扩展名之间的分界点。扩展名本身不应该包含任何点。我们在正则表达式中通过在字符类中放置一个点来指定这一点。点只是字符类中的一个文字字符。所以我们不需要转义它,正则表达式末尾的锚确保我们匹配的是.txt而不是.0。
如果字符串以反斜杠结尾,或者文件名不包含任何点,则正则表达式根本不匹配;当匹配时,它将匹配扩展名,包括分隔扩展名的点和...
laik7k3q6#
我建议使用这个函数,因为它可以避免返回null
此函数接受一个可选的filename参数,该参数可以是未定义的。如果未定义文件名,则函数返回undefined。否则,函数使用正则表达式从文件名中提取文件扩展名。如果正则表达式匹配,则函数返回提取的文件扩展名;否则返回undefined。