如何使用正则表达式但以另一种格式替换文件的相同名称?

Posted

技术标签:

【中文标题】如何使用正则表达式但以另一种格式替换文件的相同名称?【英文标题】:How can I replace the same name of a file using regex but in another format? 【发布时间】:2014-04-24 14:43:59 【问题描述】:

我是编程新手,对正则表达式不太了解。我希望加载/读取一个 csv 文件,然后使用 csv 文件的相同名称保存在一个 txt 文件中。我举个例子吧。

D:\Project\File\xxx.csv

加载这个文件后,我想获取名称“xxx”并将其保存在一个txt文件中:

D:\Project\File\xxx.txt

或者可能在另一个文件夹中,例如:

D:\Project\Specifications\PersonInfo.csv

保存到

D:\Project\DataBank\PersonInfo.txt

【问题讨论】:

非常感谢大家的回答建议! 【参考方案1】:

这可以通过多种方式实现。

也许你缺少的是 System.IO.Path 类 (MSDN article here) 的知识。

例如更改扩展名可以这样完成:

string originalFilePath = @"D:\Project\File\xxx.csv";
string newFilePath = Path.ChangeExtension(originalFilePath, ".txt");

注意:您需要明确说明扩展名的前导点(“.”)。

这里有一些“路径代数”的乐趣,你可以结合起来创造你想要的效果:

string originalFilePath = @"D:\Project\File\xxx.csv";
string thePath = Path.GetDirectoryName(originalFilePath);
// will be @"D:\Project\File"

string filename = Path.GetFileName(originalFilePath);
// will be "xxx.csv"

string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(originalFilePath);
// will be "xxx"

string recombinedFilePath = Path.Combine( @"D:\OtherFolder", "somethingElse.txt" );
// will be @"D:\OtherFolder\somethingElse.txt"

注意Path.Combine 知道如何处理多余/缺失的前导/尾随反斜杠。

例如:

Path.Combine(@"D:\MyFolder1", @"MyFolder2\MyFile.txt") Path.Combine(@"D:\MyFolder1\", @"MyFolder2\MyFile.txt") Path.Combine(@"D:\MyFolder1", @"\MyFolder2\MyFile.txt") Path.Combine(@"D:\MyFolder1\", @"\MyFolder2\MyFile.txt")

都会产生相同的结果:@"D:\MyFolder1\MyFolder2\MyFile.txt"

【讨论】:

【参考方案2】:

你不需要正则表达式。

您可以使用Path.GetFileName 或Path.GetFileNameWithoutExtension:

string fileName = Path.GetFileNameWithoutExtension("D:\Project\Specifications\PersonInfo.csv");

【讨论】:

【参考方案3】:

您不需要正则表达式,因为 .NET 提供了一个 System.IO.Path 类来专门处理文件名操作。

例如,要将.csv 替换为.txt,您可以使用以下调用:

var csvPath = @"D:\Project\File\xxx.csv";
var txtPath = Path.Combine(
    Path.GetDirectoryName(csvPath)
,   Path.GetFileNameWithoutExtension(csvPath)+".txt"
);

您使用类似的技巧来替换文件路径的其他部分。以下是更改***目录名称的方法:

var csvPath = @"D:\Project\Specifications\xxx.csv";
var txtPath = Path.Combine(
    Path.GetDirectoryName(Path.GetDirectoryName(csvPath))
,   "DataBank"
,   Path.GetFileNameWithoutExtension(csvPath)+".txt"
);

【讨论】:

【参考方案4】:

如果你想为此使用正则表达式,这个正则表达式会得到你想要的部分:

([^\\]+)\.[^.\\]+$

第一组(在括号中)匹配一个或多个字符(尽可能多)不是反斜杠。然后需要有一个文字点。然后是一个或多个不是点或反斜杠的字符(尽可能多),然后是字符串的结尾。该组捕获了想要的部分。

【讨论】:

以上是关于如何使用正则表达式但以另一种格式替换文件的相同名称?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 - 以特定字符串开头但不以另一个子字符串结尾

正则表达式如何替换并修改自身的部分内容?

使用正则表达式替换多个标题名称

尝试以另一种方法访问临时数组

如何以另一种形式使用标签中的 user_id

如何使用 PL/SQL 正则表达式将 HTML 标记及其内容替换为相同数量的“?s”?