如何使用Path.GetInvalidPathChars在较大的字符串中查找文件名?

时间:2017-05-22 09:33:27

标签: c# .net regex string

我的目标是在较大的字符串中找到文件名(“MyFile.txt”)。即:

  

之前的一些文字 MyFile.txt 之后的其他文字

目前我正在成功使用正则表达式,其字符类如下(简化):

[\w\.\-]

这样可以正常工作,直到该文件包含\w组之外的其他字符,例如一个短划线:“My-File.txt”。

我的方法:

方法Path.GetInvalidPathChars返回无效字符数组。我试过用这种方法。不幸的是,我发现没有办法“转换”这个在正则表达式中有用。

我知道

但是,我找不到任何解决方案。

我的问题:

是否有正则表达式(或任何其他方式)根据Path.GetInvalidPathChars的结果在较大的字符串中查找和提取文件名?

2 个答案:

答案 0 :(得分:3)

我根本不会使用正则表达式,因为它变得非常复杂和难以理解。特别是文件名可以是任何字符串,包括大多数特殊字符,数字,空格。更糟糕的是甚至没有点的文件来分隔扩展名。因此,我建议您只需执行Contains - 检查所有无效字符:

char[] invalidChars = Path.GetInvalidPathChars;
bool valid = !myString.Contains(x => invalidChars.Contains(x));

相反,提取候选人更简单。我们的想法是在所有无效字符上拆分大字符串。这意味着无效字符之间的所有内容都被视为文件名,例如:

  

"myTest.extension""myTest.extension"
  "myFile:anotherFile""myFile"; "anotherFile"
  "myFile with space""myFile with space"
  "a File with .-determined extension.dot""a File with .-determined extension.dot"

这是通过以下代码实现的:

var fileNames = myText.Split(invalidChars);

编辑:如果你真的想要一个正则表达式,你可以用无效字符动态构建一个:

var pattern = String.Format("([^{0}]*)", new String(invalidCharacters));
var r = new Regex(pattern);

答案 1 :(得分:0)

如果您的文件名不包含空格且执行包含扩展名,那么这个简单的想法可能会对您有所帮助

string line = "Some text before MyFile.txt some other text after";

//If you look for path:
//var array = Path.GetInvalidPathChars().ToList();

//If you look for file name
var array = Path.GetInvalidFileNameChars().ToList();
array.Add(' ');

var potentialFileNames = line.Split(array.ToArray(), StringSplitOptions.RemoveEmptyEntries)
                             .Where(i => i.Contains('.')).ToList();

 //potentialFileNames[0] = "MyFile.txt"