我有一个包含文本的文件.现在,我必须用另一个替换一些字符串.例如,我必须更换
"[ContactLetterSalutation]"
Run Code Online (Sandbox Code Playgroud)
同
"Dear Thomas Kehl".
Run Code Online (Sandbox Code Playgroud)
现在,占位符可能"[ContactLetterSalutation]"包含某个地方"=\r\n"- 例如,这可能是一次,两次或更多次
"[Conta=\r\ntLetterSa=\r\nlutation]".
Run Code Online (Sandbox Code Playgroud)
我现在正在寻找一种方式,我也可以替换它 - 我不知道将会有多少次"=\r\n".困难在于,我不应该替换"=\r\n"文本中出现的所有内容.有人可以帮我怎么做?是否有可能使用RegEx执行此操作?
谢谢.最诚挚的问候,托马斯
例:
[任何东西].[Conta=\r\ntLetterSa=\r\nlutation].ContatLetterSalutation来查找正确的值.[Conta=\r\ntLetterSa=\r\nlutation]为该值.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);
Run Code Online (Sandbox Code Playgroud)
编辑:
RegexOptions.Singleline导致.匹配\n
EDIT2:虽然以上内容适用于小文件,但我认为这个问题对于无法将整个文件放入单个字符串的流更有趣.我想出了这个,但它可能有错误:
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();
}
Run Code Online (Sandbox Code Playgroud)