如何替换>一个字符串上的1个令牌?

时间:2013-05-21 23:09:15

标签: c# regex parsing

我有tokens

的列表
 [@date]
 [@time]
 [@fileName]
 ... etc

它遍布整个大文件。当一行只有一个令牌时,我可以轻松解析文件并用Regex.Replace替换它们。然而,当一条线上有两个令牌时会出现问题 例如:

[@date] [@time]

我想要做的是将String.Split" " as the delimiter一起使用,然后如果有令牌则迭代结果检查。

但我发现这种方法有两个问题,文件相当大,这肯定会影响性能。第二个问题是将要输出的文件是SQL文件,我想保留空白区域仅用于外观。

这个问题有更优雅的解决方案吗?或者它只是另一种过早优化的情况?

3 个答案:

答案 0 :(得分:2)

您可以做的一件事是,不是逐行替换模式,而是在整个文件中替换它们:

string fileContent = File.ReadAllText(path);
fileContent = Regex.Replace(fileContent, pattern1, replacement1);
...
fileContent = Regex.Replace(fileContent, patternN, replacementN);

答案 1 :(得分:1)

执行此操作的一种简单方法是分别存储标记及其值,然后迭代它们,使用该标记的值替换查询。示例如下:

var tokensWithValues = new Dictionary<string, object>()
{
    {"[@date]", DateTime.Now},
    {"[@time]", DateTime.Now.Ticks},
    {"[@fileName]", "myFile.xml"},
};

var sqlQuery = File.ReadAllText("mysql.sql");

foreach (var tokenValue in tokensWithValues)
{
    sqlQuery = sqlQuery.Replace(tokenValue.Key, tokenValue.Value.ToString());
}

答案 2 :(得分:0)

尝试使用string.Replace(...)扩展名。这将允许您替换字符串的所有实例。

例如

string file = File.ReallAllText("myfile.txt");


file.Replace("[@date]", "replaced_value");

上述内容会将“[@date]”的所有实例替换为“replacement_value”。

编辑为先前的答案包括OP无法使用的自定义扩展程序。谢谢llya。