Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于匹配/提取文件扩展名的Javascript正则表达式_Javascript_Regex - Fatal编程技术网

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

用于匹配/提取文件扩展名的Javascript正则表达式,javascript,regex,Javascript,Regex,下面的正则表达式 var patt1=/[0-9a-z]+$/i; 提取字符串的文件扩展名,例如 filename-jpg filename#gif filename.png 如何修改此正则表达式,使其仅在字符串实际上是以一个点作为分隔符的文件名时返回扩展名?(显然,文件名#gif不是常规文件名) 根据tvanofsson的评论进行更新我想澄清一下,当JS函数接收到字符串时,字符串将已经包含一个没有空格、没有点和其他特殊字符的文件名(它实际上将被处理为slug)。问题不在于解析文件名,而在于

下面的正则表达式

var patt1=/[0-9a-z]+$/i;
提取字符串的文件扩展名,例如

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


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

只需在正则表达式中添加一个

var patt1=/\.[0-9a-z]+$/i;
因为点在正则表达式中是一个特殊字符,所以需要对其进行转义,以便按字面意思进行匹配:
\。

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

例子:
[
“foobar.a”,
“foobar.txt”,
“foobar.foobar1234”
].forEach(t=>
console.log(
t、 匹配(/\[0-9a-z]+$/i)[0]
) 
)
试试看

此RegExp用于从URL提取文件扩展名,即使是具有
?foo=1
查询字符串和
#hash
结尾的URL

它还将为您提供扩展名
$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"]
p.S.+1适用于@stema,他将介绍一些涉及的RegExp语法基础。

示例列表:

var fileExtensionPattern = /\.([0-9a-z]+)(?=[?#])|(\.)(?:[\w]+)$/gmi
//regex flags -- Global, Multiline, Insensitive

var ma1 = 'css/global.css?v=1.2'.match(fileExtensionPattern)[0];
console.log(ma1);
// returns .css

var ma2 = 'index.html?a=param'.match(fileExtensionPattern)[0];
console.log(ma2);
// returns .html

var ma3 = 'default.aspx?'.match(fileExtensionPattern)[0];
console.log(ma3);
// returns .aspx

var ma4 = 'pages.jsp#firstTab'.match(fileExtensionPattern)[0];
console.log(ma4);
// returns .jsp

var ma5 = 'jquery.min.js'.match(fileExtensionPattern)[0];
console.log(ma5);
// returns .js

var ma6 = 'file.123'.match(fileExtensionPattern)[0];
console.log(ma6);
// returns .123

.

ONELINER:

let ext=(filename.match(/\。([^.]*?)(?=\?|#|$)/)| |[])[1]
以上解决方案包括链接。它接受从最后一个点到第一个“
”或“
#
”字符或字符串结尾之间的所有内容。要忽略“
”和“
#
”字符,请使用
/\([^.]*)$/
。要仅忽略“
\
”,请使用
/\.([^.]*?)(?=\?\$)/
。例子

函数getExtension(文件名){
返回(filename.match(/\([^.]*?)(?=\?|#| |$)/)| |[])[1];
}
//试验
[
“abcd.Ef1”,
“abcd.efg”,
“abcd.efg?aaa&a?a=b#cb”,
“abcd.efg#aaa(aaa)bb”,
“abcd”,
“abcdefg?aaa&aa=bb”,
“abcdefg#aaa uu bb”,

].forEach(t=>console.log(`${t.padEnd(21',)}->${getExtension(t)}')
正则表达式是否必须确定文件名是否为合法文件名?什么定义了合法的文件名?什么定义了合法的文件扩展名?例如,
foobar.zi
是合法的文件名吗?怎么样
foo.bar.zi_u2;
?典型的操作系统文件名..你的例子中有空格,这在我们的系统中是不可能发生的,@stema提供的答案似乎使用了双扩展名,所以对我来说已经足够好了。这两个例子都是Unix和Windows中的合法文件名。你的问题可以通过详细说明你认为是合法文件名的细节来改进。它将使答案,尤其是被接受的答案对未来可能希望解决相同或类似问题的读者更有意义。如果我不需要匹配中的点,而只需要扩展名,该怎么办?@user2727195没有点,你就不匹配扩展名。如果你是说。。。如何仅使用结果文本,然后可以使用子字符串,如:
((“file.ext”).match(patt1)| |“”).substring(1)
对于.tar.gz扩展也失败上面注释中的代码对我不起作用。如果你想要的只是分机,而不是圆点,那么<代码>常量ext=(“file.ext”.match(/\[0-9a-z]{1,5}$/i)| |[“”])[0]。子字符串(1)
var fileExtensionPattern = /\.([0-9a-z]+)(?=[?#])|(\.)(?:[\w]+)$/gmi
//regex flags -- Global, Multiline, Insensitive

var ma1 = 'css/global.css?v=1.2'.match(fileExtensionPattern)[0];
console.log(ma1);
// returns .css

var ma2 = 'index.html?a=param'.match(fileExtensionPattern)[0];
console.log(ma2);
// returns .html

var ma3 = 'default.aspx?'.match(fileExtensionPattern)[0];
console.log(ma3);
// returns .aspx

var ma4 = 'pages.jsp#firstTab'.match(fileExtensionPattern)[0];
console.log(ma4);
// returns .jsp

var ma5 = 'jquery.min.js'.match(fileExtensionPattern)[0];
console.log(ma5);
// returns .js

var ma6 = 'file.123'.match(fileExtensionPattern)[0];
console.log(ma6);
// returns .123