我有一个输入字符串-
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
方法可以实现此目的?或者有人可以帮助我指出我可能出了问题的地方吗?
答案 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))
。