我有一个文件,其中包含文本。现在,我必须用另一个替换一些字符串。例如我必须更换
"[ContactLetterSalutation]"
与
"Dear Thomas Kehl".
现在,占位符 "[ContactLetterSalutation]"
可能包含某处 "=\r\n"
- 这可能是一次、两次或更多次- 例如
"[Conta=\r\ntLetterSa=\r\nlutation]".
我现在正在寻找一种方法,我也可以替换它 - 我不知道 "=\r\n"
在哪里以及有多少次。困难在于,我不应该替换文本中出现的所有 "=\r\n"
。有人可以帮我怎么做吗?是否有可能使用 RegEx 执行此操作?
谢谢。 最好的问候,托马斯
最佳答案
string GetReplacement(Match m) {
// Get the matched string.
string x = m.ToString().Replace("=\r\n","");
return Lookup[x];
}
...
file = Regex.Replace(file, @"\[.*?\]", GetReplacement, RegexOptions.Singleline);
编辑:
RegexOptions.Singleline 导致 .匹配\n
编辑2:虽然上面的问题适用于小文件,但我认为这个问题对于无法将整个文件放入单个字符串的流更有趣。我想出了这个,但它可能有错误:
static IEnumerable<string> Chunk(TextReader reader) {
char[] chars = new char[MaxBufferSize];
string buffer = "";
int charsRead;
while ((charsRead = reader.ReadBlock(chars, 0, MaxBufferSize)) > 0) {
buffer = buffer + new string(chars,0,charsRead);
int indexOfOpenBracket;
if((indexOfOpenBracket = buffer.IndexOf('[')) == -1) {
if (!string.IsNullOrEmpty(buffer)) yield return buffer;
buffer = "";
continue;
}
while (indexOfOpenBracket!=-1) {
string outsideBrackets = buffer.Substring(0, indexOfOpenBracket);
if(!string.IsNullOrEmpty(outsideBrackets)) yield return outsideBrackets;
buffer = buffer.Substring(indexOfOpenBracket + 1);
int indexOfCloseBracket = buffer.IndexOf(']');
if (indexOfCloseBracket != -1) {
string insideBrackets = buffer.Substring(0, indexOfCloseBracket);
buffer = buffer.Substring(indexOfCloseBracket + 1);
yield return DoLookup(insideBrackets);
} else {
buffer = '[' + buffer;
break;
}
indexOfOpenBracket = buffer.IndexOf('[');
}
}
yield return buffer;
}
public static void BufferReplace(Stream input, Stream output) {
StreamReader reader = new StreamReader(input);
StreamWriter writer = new StreamWriter(output);
foreach (var chunk in Chunk(reader)) {
writer.Write(chunk);
}
writer.Flush();
}
关于c#用do替换字符串包含未知部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6477667/