正则表达式检查文件是否有任何扩展名。

3
我希望您能够提供一个正则表达式来测试文件是否具有任何扩展名。我定义它为:如果在最后一个“.”之后没有斜杠,则文件具有扩展名。这些斜杠始终是反斜杠。

我从这个正则表达式开始:

.*\..*[^\\]

这意味着

.*          Any char, any number of repetitions 
\.          Literal .
.*          Any char, any number of repetitions 
[^\\]       Any char that is NOT in a class of [single slash]

这是我的测试数据(不包括##,那是我的注释)

\path\foo.txt            ## I only want to capture this line
\pa.th\foo               ## But my regex also captures this line <-- PROBLEM HERE
\path\foo                ## This line is correctly filtered out

这个问题需要使用正则表达式,你需要编写一个匹配规则。

你需要一个负向先行断言。 - C.B.
3个回答

9
您的解决方案几乎正确。请使用以下内容:
^.*\.[^\\]+$

Sample at rubular.


@C.B. 不是的,这就是为什么我把^$之间的所有内容都包围起来的原因。 - BlackBear
@oleksii:如果你想将每一行作为单独的测试使用,你需要添加多行m标志,这样^$就会匹配行的开头和结尾,而不是整个字符串的开头和结尾。 - Robin
1
我最终使用的正则表达式是 ^.*\.[^\\$]。我在 NEsper 中的 C# regexp 类中使用它。将其标记为正确。由于差异只是微小的,而且在线示例链接也可以正常工作。感谢您的帮助。 - oleksii
@oleksii - 你之前的最终解决方案:^.*\.[^\\$] 没有意义,也不符合你问题的要求。例如,有效的文件名:file.$$$ 不匹配,而无效的文件名:\pa.th\foo 却匹配了。然而,BlackBear 在这里提供的答案是正确的。话虽如此,我建议使用的模式只是:\.[^.\\]+$,它仅匹配文件名的扩展部分(即最后一个点后跟一个或多个非点、非反斜杠,后跟字符串的结尾)。 - ridgerunner
@ridgerunner 没错。我看了 ^.*\.[^\\$] 这一段,[^\\$] 部分确实没有意义。我认为我的问题在于行尾(字符返回)。一旦我进行逐行匹配,那么你的解决方案 \.[^.\\]+$ 和建议的解决方案 ^.*\.[^\\]+$ 都可以正常工作。谢谢。 - oleksii
显示剩余2条评论

5

我不会在这里使用正则表达式。我会用split来按/.分割。

var path = '\some\path\foo\bar.htm',
    hasExtension = path.split('\').pop().split('.').length > 1;

if (hasExtension) console.log('Weee!');

这里有一个更简单的函数来检查它。
const hasExtension = path => {
    const lastDotIndex = path.lastIndexOf('.')
    return lastDotIndex > 1 && path.length - 1 > lastDotIndex
}

if (hasExtension(path)) console.log('Sweet')

3
您也可以尝试更简单的方法:
(\.[^\\]+)$

详情:

$      = Look from the end of string
[^\\]+ = Any character except path separator one or more time
\.     = looks for <dot> character before extension

实时演示


对于使用Elasticsearch的人,您需要添加一些转义字符。(./[^\\/]+)$ - James111

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接