替换指定位置或索引处的字符串值

本文关键字:字符串 索引 定位 位置 替换 | 更新日期: 2023-09-27 18:16:41

我有一个文本

图表类型:%s'n非标准Visio项目将按以下方式转换:'n'tShapes: %s'n'tConnectors: %s

在这里,我需要将第一个%s替换为text1,第二个%s替换为text2,第三个%s替换为text3等。这可能吗?

替换指定位置或索引处的字符串值

你问如何使用字符串。格式在你的评论。这里有一个例子。如果这不是你需要的,我将在几分钟后再次更新。

string output = String.Format("Diagrams type: {0}'nNon-standard Visio items will be converted as follows:'n'tShapes: {1}'n'tConnectors: {2}", "SomeText 1", "Some More Text", "Even More Text");

将按提供的顺序用每个参数替换每个令牌({N})。

如果需要保留字符串的现有格式,可以使用以下方法:

    Regex regex = new Regex(@"'%s'b.*");
    string inputString = "Diagrams type: %s'nNon-standard Visio items will be converted as follows:'n'tShapes: %s'n'tConnectors: %s";
    int i = 0;
    string cSharpString = regex.Replace(inputString, match => { return String.Format("{{{0}}}", i++); });
string output = String.Format(cSharpString, "SomeText 1", "Some More Text", "Even More Text");

所做的是找到%s的所有实例并将它们替换为c#格式。然后针对cSharpString变量运行标准String.Format并获得输出。

无需更改开头字符串(以防无法控制该字符串)

我认为您需要循环每次出现并依次使用IndexOf方法替换您发现的每个%s:

string[] replacements = new string[] { "text1", "text2", "text3" };
string test = "Diagrams type: %s'nNon-standard Visio items will be converted as follows:'n'tShapes: %s'n'tConnectors: %s";
int index = test.IndexOf("%s");
int occurance = 0;
while(index != -1)
{
    //replace the occurance at index using substring
    test = test.Substring(0, index) + replacements[occurance] + test.Substring(index + 2);
    occurance++;
    index = test.IndexOf("%s");
}
Console.WriteLine(test);

我不确定你在哪里有"text1"等存储,所以我把它们放在一个数组中,但你可以使用上面的occurance变量从你需要的任何地方抓取这些值。

编辑@Rawling在评论中提出了一个很好的观点,即上述方法效率低下。我使用了上面的可读性,但通过一些简单的改变,我们可以删除shlemiel的画家行为:

string[] replacement = new string[] {"a", "b", "test"};字符串test = "图表类型:%s'n非标准Visio项目将按如下方式转换:'n'tShapes: %s'n'tConnectors: %s";StringBuilder result = new StringBuilder();

int index = test.IndexOf("%s");
int occurance = 0;
while (index != -1)
{
    result.Append(test.Substring(0, index));
    result.Append(replacements[occurance]);
    test = test.Substring(index + 2);
    occurance++;
    index = test.IndexOf("%s");
}
Console.WriteLine(result.ToString());

它与上面的类似,但是我们减少了test字符串的大小来搜索%s,然后将我们找到的每个部分附加到StringBuilder