使用正则表达式提取文件名

12
如果我只想匹配 fileName,也就是说,在 C://Directory/FileName.cs 中,使用正则表达式忽略 FileName.cs 之前的所有内容。
我该怎么做呢?
我需要这个功能用于我正在开发的已编译的 UI ... 不能使用编程语言,因为它只接受正则表达式。
有什么想法吗?

1
我一直在想为什么有些人在有更简单的解决方案时还会问正则表达式。 - J-16 SDiZ
@sumesh,我在我的答案中提供的正则表达式对你有用吗?如果没有,你能否提供更多关于你的引擎所支持的具体正则表达式特性的信息? - Mike Dinescu
没有,它没有起作用。这个引擎只支持正则表达式,有两个参数:第一个参数是要扫描的文件,第二个参数是要匹配的模式。文件路径在其他地方指定。问题在于,我的应用程序规则规定文件名中不应该出现“abc”,但是文件路径中可以有“abc”,例如C://folder/abc/folder/fileName.cs。现在我需要传递一个正则表达式,以便引擎仅扫描文件而不是整个路径。因此,如果我可以在第一个参数中指定文件名,即在/之后但在.cs之前的任何内容,那么每个人都会很高兴。 - sumesh ghimire
Sumesh - 然后把所有信息放在原始问题中!从正则表达式的某个部分提取文件名并排除特定信息是非常不同的任务。 - Peter Boughton
12个回答

20

可能类似这样的代码可以起作用:

[^/]*$

它匹配所有不是"/"的字符直到行尾。

如果您想匹配使用 "\" 路径分隔符的路径,则需要将正则表达式更改为:

[^\]*$

如果您的编程语言或环境要求,请确保转义“\”字符。例如,您可能需要编写类似于以下内容的内容:

[^\\]*$

编辑: 我删除了开头和结尾处的“/”,因为它们可能会让人困惑,因为它们实际上不是正则表达式的一部分,但它们通常用于表示正则表达式。

当然,根据regEx引擎支持的功能,您可以使用向前/向后查找和捕获等功能来制作更好的正则表达式。


在正则表达式中,您总是需要使用两个反斜杠来匹配目标字符串中的一个。如果您正在使用像Java这样不提供正则表达式字面量或原始/原义字符串的语言,则必须进行双重转义:"[^\\]*"。 - Alan Moore
哈哈,我浪费了一个小时在玩反向预查上,最终得到了一个有100个字符的正则表达式...然后我看到了你的,删掉了所有的反向预查,它仍然有效。:P - Victor

7

1
这个。具体来说是GetFileName()方法。 - Turnor
1
我同意,API优先,正则表达式其次。 - Mercer Traieste

5

根据您的评论,需要排除与“abc”不匹配的路径,请尝试以下方法:

^.+/(?:(?!abc)[^/])+$

完全分割在正则表达式注释模式中,即:

(?x)     # flag to enable comments
^        # start of line

.+       # match any character (except newline)
         #   greedily one or more times
/        # a literal slash character

(?:      # begin non-capturing group
  (?!      # begin negative lookahead
           # (contents must not appear after the current position)
    abc      # literal text abc
  )        # end negative lookahead
  [^/]     # any character that is not a slash
)        # end non-capturing group
+        # repeat the above nc group one or more times
         #   (essentially, we keep looking for non-backspaces that are not 'abc')

$        # end of line

4

对我起作用的正则表达式是

[^\/]*$

1
我很晚才来参加这个派对,而且我也忽略了正则表达式的要求,因为正如J-16 SDiZ所指出的那样,有时候有更好的解决方案。即使这个问题已经4年了,寻找简单解决方案的人们也应该有选择。

尝试使用以下方法:

public string ConvertFileName(string filename)
    {
        string[] temparray = filename.Split('\\');
        filename = temparray[temparray.Length - 1];
        return filename;
    }

该方法将字符串在 "\" 字符上分割,将结果字符串存储在数组中并返回数组的最后一个元素(文件名)。
尽管 OP 似乎是为 UNIX 编写的,但很容易想出如何将其调整到您特定的需求。

如果你要使用C#编程语言,为什么不使用Path.GetFileNamewithoutExtension这个方法呢? - keyboardP
@keyboardP 那是一种选择,但在我的情况下,扩展名作为视觉检查非常重要。另外,我正在使用的文件路径是由OpenFileDialog生成的。我只使用转换器为UI创建缩短字符串,并且与OP提到的一样,我关心的是删除文件名之前的所有内容,而不是之后。 - spugm1r3

1
请尝试以下内容(适用于“/”和“\”):
[^\/|\\]*$

1
由于某些情况下文件名可以被解释为基本名称,所以这个例子可以提取任何没有扩展名的文件的文件名/基本名称。同样的方法也可以获取最后一个目录。
你可以在这里查看它的运行方式并进行测试。 https://regexr.com/4ht5v 正则表达式是: .+?\\(?=\w+)|\.\w+$|\\$

之前:

C:\Directory\BaseFileName.ext

C:\Directory\BaseFileName

C:\This is a Directory\Last Directory With trailing backslash\

C:\This is a Directory\Last Directory Without trailing backslash

之后:

BaseFileName

BaseFileName

Last Directory With trailing backslash

Last Directory Without trailing backslash

为了完整起见,如果有人需要,这是如何使用JavaScript实现的。

// Example of getting a BaseFileName from a path

var path = "C:\\Directory\\FileName.cs";
var result = path.replace(/.+?\\(?=\w+)|\.\w+$|\\$/gm,"");
console.log(result);


0

我在Powershell中没有使用RegEx完成了这个操作:

  1. 将链接放入变量中

$Link = "http://some.url/some/path/file.name"

  1. 按“/”字符拆分链接

$split = $Link.Split("/")

  1. 计算拆分数

$SplitCount = $Split.Count

  1. 定位文件名

$Split[$SplitCount -1]

完整代码:

$Link = "http://some.url/some/path/file.name"
$Split = $Link.Split("/")
$SplitCount = $Split.Count
$Split[$SplitCount -1]

0
假设文件名包含特殊字符,尤其是在支持MAC的情况下,文件名中允许使用特殊字符,服务器端Path.GetFileName(fileName)会因路径中存在非法字符而失败并抛出错误。以下代码使用正则表达式来解决这个问题。
以下正则表达式处理了两件事情。
  1. 在IE中,当文件上传时,文件路径也包含文件夹(例如c:\samplefolder\subfolder\sample.xls)。下面的表达式将用空字符串替换所有文件夹并保留文件名:

  2. 在Mac中使用时,只提供文件名,因为它是Safari浏览器,并允许文件名中包含特殊字符。

    var regExpDir = @"(^[\w]:\\)([\w].+\w\\)";
    
    var fileName = Regex.Replace(fileName, regExpDir, string.Empty);
    

0

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