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

标签 c# regex replace

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

"[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/

相关文章:

python - 如何使用 python 正则表达式替换使用捕获的组?

c# - 无法转换对象类型 "System.Web.Mvc.HtmlHelper` 1 [System.Object] "to type"System.Web.Mvc.HtmlHelper "

c# - 如何在c#中调用基重载方法?

javascript - 如何在 javascript 的替换中循环遍历正则表达式的匹配项?

Android Kotlin正则表达式替换一个子串,获取被替换的子串

c# - 在字符串之后替换 - 在字符之前

gradle - 没有@@的任何字符串的Gradle replaceToken

c# - 使用 c#/ASP.NET 添加自定义 SOAP header

c# - 如何有条件地调用具有约束的泛型方法?

Python 正则表达式?我有麻烦了