我的目标是在较大的字符串中找到文件名(“MyFile.txt”)。即:
之前的一些文字 MyFile.txt 之后的其他文字
目前我正在成功使用正则表达式,其字符类如下(简化):
[\w\.\-]
这样可以正常工作,直到该文件包含\w
组之外的其他字符,例如一个短划线:“My-File.txt”。
我的方法:
方法Path.GetInvalidPathChars
返回无效字符数组。我试过用这种方法。不幸的是,我发现没有办法“转换”这个在正则表达式中有用。
我知道
但是,我找不到任何解决方案。
我的问题:
是否有正则表达式(或任何其他方式)根据Path.GetInvalidPathChars
的结果在较大的字符串中查找和提取文件名?
答案 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"