仅替换C#字符串中子字符串的'n'个出现

时间:2019-03-22 06:53:20

标签: c# regex string substring

我有一个输入字符串-

  

abbdabab

如何仅将data子字符串的 2 3rd 后续事件替换为任意随机字符串,例如{{ 1}}保持原始字符串不变。在这种情况下的示例-

  

第一输出-xbdabab第二输出-abbdxab第三输出-abbdabx等等...

我尝试过使用正则表达式--

"ab"

在这里,当计数器"x"的值为int occCount = Regex.Matches("abbdabab", "ab").Count; if (occCount > 1) { for (int i = 1; i <= occCount; i++) { Regex regReplace = new Regex("ab"); string modifiedValue = regReplace.Replace("abbdabab", "x", i); //decodedMessages.Add(modifiedValue); } } 时,我可以获得第一个输出,但无法获取后续结果。是否有任何重载 i方法可以实现此目的?或者有人可以帮助我指出我可能出了问题的地方吗?

3 个答案:

答案 0 :(得分:2)

您可以尝试使用IndexOf代替正则表达式:

string source = "abbdabab";
string toFind = "ab";
string toSet = "X";

for (int index = source.IndexOf(toFind); 
     index >= 0; 
     index = source.IndexOf(toFind, index + 1)) {
  string result = source.Substring(0, index) + 
                  toSet + 
                  source.Substring(index + toFind.Length);

  Console.WriteLine(result);
}

结果:

Xbdabab
abbdXab
abbdabX

答案 1 :(得分:1)

您可以使用StringBuilder

string s = "abbdabab";
var matches = Regex.Matches(s, "ab");
StringBuilder sb = new StringBuilder(s);
var m = matches[0]; // 0 for first output, 1 for second output, and so on
sb.Remove(m.Index, m.Length);
sb.Insert(m.Index, "x");
var result = sb.ToString();
Console.WriteLine(result);

答案 2 :(得分:0)

您可以使用动态构建的正则表达式直接与regex.Replace一起使用:

var s = "abbdabab";
var idx = 1; // First = 1, Second = 2
var search = "ab";
var repl = "x";
var pat = new Regex($@"(?s)((?:{search}.*?){{{idx-1}}}.*?){search}"); // ((?:ab.*?){0}.*?)ab
Console.WriteLine(pat.Replace(s, $"$((?:ab.*?){0}.*?)ab{repl}", 1));

请参见C# demo

该模式看起来像(?s)并将匹配

  • RegexOptions.Singleline-.使((?:ab.*?){0}.*?)也匹配换行符
  • ${1}-第1组(以后,该值将与(?:ab.*?){0}反向引用一起放回到结果中)
    • ab-出现.*?的次数为0,后跟0个以上的字符的次数尽可能少
    • ab-尽可能少包含0个字符
  • pat.Replace-搜索字符串/模式。

1的最后一个参数是search,因此只有第一个出现的位置可以被替换。

如果var search = Regex.Escape("a+b");是文字文本,则需要使用repl

如果$可以有repl = repl.Replace("$", "$$");,请添加if isinstance(v, collections.MutableMapping): items.extend(flatten(v, new_key, sep=sep).items()) elif isinstance(v, collections.Sequence) and not isinstance(v, str): items.extend(sum((flatten(vv, new_key + sep + str(kk), sep).items() for kk, vv in enumerate(v)), [])) else: items.append((new_key, v))