c#用包含未知部分的替换字符串

Ben*_*ual 3 c# regex replace

我有一个包含文本的文件.现在,我必须用另一个替换一些字符串.例如,我必须更换

"[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执行此操作?

谢谢.最诚挚的问候,托马斯

Sjo*_*erd 6

  • 使用正则表达式搜索括号内的任何内容.
  • 对于每个匹配,请删除所有=\r \n以查找密钥.
  • 将匹配替换为值.

例:

  • 你搜索[任何东西].
  • 你找到了[Conta=\r\ntLetterSa=\r\nlutation].
  • 您可以使用该键ContatLetterSalutation来查找正确的值.
  • 您替换[Conta=\r\ntLetterSa=\r\nlutation]为该值.


Bil*_*rry 6

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)