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();
}
這是Sjoerd的答案的代碼版本;我得到了忍者,並沒有留意。我會離開它,但標記他是正確的。 –
比爾的答案是相當的,但比我的更優雅。只要確保如果你使用他的正則表達式,你正在查找的模式具有[和]在其中或使用組,如我所描述的。 – Rob
嗨比爾。謝謝。但有一個問題。 \ r \ n是一個LineBreak - 現在您的RegEx-Pattern沒有找到它。我必須改變什麼,RegEx-Pattern還會在[]中找到包含LineBreak的模式? – BennoDual