C# 如何更换>;1字符串上的标记?

C# 如何更换>;1字符串上的标记?,c#,regex,parsing,C#,Regex,Parsing,我有一个代币列表 [@date] [@time] [@fileName] ... etc 分散在一个大文件中。我可以解析文件并用Regex替换它们。当一行上只有一个令牌时,可以轻松地替换。但是,当一行上有两个令牌时,就会出现问题 例如: 我想做的是使用String.Split和”作为分隔符,然后迭代检查结果是否有标记 但是我发现这种方法有两个问题,文件相当大,这肯定会影响性能。第二个问题是,将要输出的文件是一个SQL文件,我希望保留空白,只是为了外观 这个问题有没有更优雅的解决方案?或

我有一个
代币列表

 [@date]
 [@time]
 [@fileName]
 ... etc
分散在一个大文件中。我可以解析文件并用
Regex替换它们。当一行上只有一个令牌时,可以轻松地替换
。但是,当一行上有两个令牌时,就会出现问题
例如:

我想做的是使用
String.Split
”作为分隔符,然后迭代检查结果是否有标记

但是我发现这种方法有两个问题,文件相当大,这肯定会影响性能。第二个问题是,将要输出的文件是一个
SQL
文件,我希望保留空白,只是为了外观


这个问题有没有更优雅的解决方案?或者这只是另一个过早优化的例子

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

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

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

比如说

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


file.Replace("[@date]", "replaced_value");
上述内容将把“[@date]”的所有实例替换为“替换的值”


编辑为上一个答案,包括OP不可用的自定义扩展。谢谢llya。

一种简单的方法是单独存储令牌及其值,然后用该令牌的值替换您的查询。举例如下:

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());
}
var-tokensWithValues=new Dictionary()
{
{[@date]',DateTime.Now},
{“[@time]”,DateTime.Now.Ticks},
{[@fileName],“myFile.xml”},
};
var sqlQuery=File.ReadAllText(“mysql.sql”);
foreach(tokensWithValues中的var tokenValue)
{
sqlQuery=sqlQuery.Replace(tokenValue.Key,tokenValue.Value.ToString());
}

在一行中使用
Regex
两个令牌有什么不对?如果不需要Regex,我会提交一个答案。虽然我同意llya的观点,但我不确定为什么正则表达式在替换一行中出现两次的指定值时会出现问题。Sina Iravanian的回答应该有效。@Ilya Ivanov你能用回答澄清你的意思吗?我还是个新手regex@Wusiji这不是答案,显然是个问题。抱歉,但我不理解您的问题,特别是当涉及到正则表达式在一行上处理多个tok时效率低下。您能否给出问题的高级描述,给出实现代码,说明期望的结果,并给出一些sql脚本示例,您希望在其中替换令牌。它不会编译,
string。replace
使用两个字符或两个字符串,而不是字符串和字符串列表。您可能想链接调用
ReplaceAll
——这不是BCL的一部分吗?奇怪的是,我很确定这个问题是关于用多个字符串替换多个令牌的(例如,
[@date]
用今天的日期,
[@time]
用当前时间等等)。我还非常确定
文件
没有
ReallAllText
方法。:-)@莉娅:哈哈,哇,是的,这是我自己的延伸系列的一部分。当我写出从哪里调用扩展的代码时,我没有注意。但是,如果没有像您提到的那样传入IEnumerable,替换是一种方法。我会相应地更新。Magcialy修复了我没有逐个遍历所有行时的所有问题
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());
}