c#将字符串替换为确实包含未知部分

| 我有一个包含文本的文件。现在,我必须用另一个替换字符串。例如我必须替换
\"[ContactLetterSalutation]\" 
 \"Dear Thomas Kehl\". 
现在,有可能占位符
\"[ContactLetterSalutation]\"
在某处包含
\"=\\r\\n\"
-可能是一次,两次或更多次-例如
\"[Conta=\\r\\ntLetterSa=\\r\\nlutation]\".
我现在正在寻找一种方法,也可以替代此方法-我不知道
\"=\\r\\n\"
的位置和次数。困难的是,我不应该替换本书中所有出现的“ 3”。有人可以帮我怎么做吗? 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();
}
    
         使用正则表达式搜索方括号内的所有内容。 对于每个匹配项,删除所有= \\ r \\ n以找到密钥。 用值替换匹配项。 例: 您搜索
[
anything
]
。 您会找到
[Conta=\\r\\ntLetterSa=\\r\\nlutation]
。 使用ѭ12键查找正确的值。 您用该值替换
[Conta=\\r\\ntLetterSa=\\r\\nlutation]
。     
        是的,您可以使用正则表达式执行此操作。我不会一that而就。我假设您有一个HashTable或其他存储,可以在其中查找占位符字符串以获取要放置的文本。另外,我假设您想从C#代码执行此操作,有一个工具调用sed可以从unix / linux或cygwin underwindows中的命令行执行此操作。并且它与正则表达式一起使用。 在计算正则表达式时,我喜欢使用以下站点:http://regexpal.com/ 因此,首先您尝试找到其中带有不需要的\\ r \\ n的占位符的模式:\“ \\ [([[^ \\]] +)\\] \”,这会找到任何开头的模式带有[具有至少一个不是]且以]结尾的字符。 一旦有了匹配项列表,就可以在将其用于查找之前删除不需要的模式。 这是一个非常简单的小例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            String textFromFile = \"some text [re=\\r\\npla=\\r\\nme] more [Anoth=\\r\\ner=\\r\\n place=\\r\\n=\\r\\n=\\r\\n holder] text\";

            foreach (Match match in Regex.Matches(textFromFile, \"\\\\[([^\\\\]]+)\\\\]\"))
            {
                String placeHolder = match.Groups[1].Value.Replace(\"=\\r\\n\", \"\");
                // *** Do rest of your work here ***.
                System.Console.WriteLine(placeHolder);
            }
        }
    }
}
该程序将输出:
replaceme
Another place holder
    

要回复问题请先登录注册