C# 如何提取并替换具有不同值的子字符串

C# 如何提取并替换具有不同值的子字符串,c#,regex,substring,C#,Regex,Substring,我有以下字符串:“使用以下数据[EnvironmentVar][TestAccount]状态已连接” 我要做的是用从XML文件检索的数据替换[EnvironmentVar][TestAccount]。因此,我需要首先将[EnvironmentVar][TestAccount]提取到它自己的字符串中,然后我已经有了一个查询XML的方法,但此外,一旦检索到该值,我需要做的是将其替换为原始字符串 还有另一个曲线球,结构并不总是: [EnvironmentVar][TestAccount] 它可能有

我有以下字符串:“使用以下数据[EnvironmentVar][TestAccount]状态已连接”

我要做的是用从XML文件检索的数据替换[EnvironmentVar][TestAccount]。因此,我需要首先将[EnvironmentVar][TestAccount]提取到它自己的字符串中,然后我已经有了一个查询XML的方法,但此外,一旦检索到该值,我需要做的是将其替换为原始字符串

还有另一个曲线球,结构并不总是:

[EnvironmentVar][TestAccount] 
它可能有额外的“节点”,如:

只要我能从原始字符串中提取这个模式,我就能从中获取数据。正如我上面提到的,我接下来需要做的是用我检索到的数据替换“[SystemTest][EnvironmentVar][TestAccount]”。例如,返回的可能是像“UKUser”这样简单的内容,因此新字符串最终将是“使用以下数据UKUser status is connected”

任何指导都将不胜感激,我相信有很多方法可以做到这一点

更新

下面是一些例子

string myQuery = "Using the following data [SystemTest][EnvironmentVar][TestAccount]";

string xmlQuery = RetrieveXMLQuery(myQuery);

//So now I want xmlQuery to be "[SystemTest][EnvironmentVar][TestAccount]"
//XML query now gets executed
string xmlResult = RetrieveXMLValue(xmlQuery);
//xmlResult would now be "UKUser"

//Now what I want to do is take the string "Using the following data [SystemTest][EnvironmentVar][TestAccount]" and replace the nodes with UKUser is it becomes "Using the following data UKUser"
//Remember that the number of nodes and the sequence wont always be the same...

如果您也要替换“额外节点”,当它们存在时:

string input = "Using the following data [EnvironmentVar][TestAccount] status is connected";
string newData = "UKUser";
string output = Regex.Replace(input, @"(\[.*\])", newData);
Console.WriteLine(output);  // Using the following data UKUser status is connected

您可以将代币分开并单独处理

text = Regex.Replace(text, @"(\[[A-Za-z]+\])", delegate(Match match)
       {
            switch (match.Groups[1].Value)
            {
                case "[SystemTest]":
                    return (string)SomeXml.Element("SystemTestNode");

                case "[TestAccount]":
                    return "123456";

                default:
                    return "";
            }
       });

如果您的模式总是以[并以]开头,那么只需使用子字符串就可以轻松地做到这一点

string original = "Using the following data [EnvironmentVar][TestAccount] status is connected";
string replacementText = "UKUser";

string newString = original.Substring(0, original.IndexOf("[")) + replacementText + original.Substring(original.LastIndexOf("]")+1);

难道你不能简单地做
str=str.Replace(“[TestAccount]”,即“此处的新数据”)?您需要使用正则表达式吗?这只会替换TestAccount,它的其余部分将保留在字符串中。我现在会用更多的信息更新我的问题。剩下的呢?依次运行多个replace调用,每次应替换一个关键字。当然,它的性能可能不是最优的,但也不是正则表达式。问题是,如果序列发生变化,那么这就不起作用。在运行时,字符串可能不同。我正在寻找一个解决方案,将工作的任何字符串。非常好,这很好地取代字符串。我很高兴。我可以使用类似的方法从原始字符串中提取[EnvironmentVar][TestAccount](或类似内容)吗?当然可以。那将是Regex。用同样的模式匹配一个向上投票和一个勾号,先生,这正是我想要的。谢谢。这是一个有趣的方法。我当然可以用这个。该模式总是以我没有测试过的代码开始[和结束],但我猜这也比使用正则表达式更有效。您还需要添加一些错误处理或验证,以确保括号存在。这是有意义的,但请设想[]之间的值是XML文件中的节点。我并不总是知道他们会是什么样子。因此,使用这种方法,我需要将它们全部映射出来。
text = Regex.Replace(text, @"(\[[A-Za-z]+\])", delegate(Match match)
       {
            switch (match.Groups[1].Value)
            {
                case "[SystemTest]":
                    return (string)SomeXml.Element("SystemTestNode");

                case "[TestAccount]":
                    return "123456";

                default:
                    return "";
            }
       });
string original = "Using the following data [EnvironmentVar][TestAccount] status is connected";
string replacementText = "UKUser";

string newString = original.Substring(0, original.IndexOf("[")) + replacementText + original.Substring(original.LastIndexOf("]")+1);