有人知道我将如何查找和替换字符串中的文本吗?基本上我有两个字符串:
string firstS = "/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDABQODxIPDRQSERIXFhQYHzMhHxwcHz8tLyUzSkFOTUlBSEZSXHZkUldvWEZIZoxob3p9hIWET2ORm4+AmnaBhH//2wBDARYXFx8bHzwhITx/VEhUf39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3//";
string secondS = "abcdefg2wBDABQODxIPDRQSERIXFh/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/abcdefg";
我想搜索
firstS
以查看它是否包含secondS
中的任何字符序列,然后将其替换。还需要用方括号中替换的字符数替换它:[已替换字符数]
例如,因为
firstS
和secondS
都包含“ 2wBDABQODxIPDRQSERIXFh”和“ / f39 / f39 / f39 / f39 / f39 / f39 / f39 / f39 / f39 / f39 / f39 / f39 / f39 / f39 / f39 /”他们将需要更换。因此,firstS
变为:string firstS = "/9j/4AAQSkZJRgABAQEAYABgAAD/[22]QYHzMhHxwcHz8tLyUzSkFOTUlBSEZSXHZkUldvWEZIZoxob3p9hIWET2ORm4+AmnaBhH//2wBDARYXFx8bHzwhITx/VEhUf39[61]f3//";
希望有道理。我想我可以使用Regex做到这一点,但是我不喜欢它的效率低下。有人知道另一种更快的方法吗?
最佳答案
有人知道另一种更快的方法吗?
是的,这个问题实际上有一个专有名称。它称为Longest Common Substring,并且具有reasonably fast solution。
这是an implementation on ideone。它查找并替换所有十个字符或更长的普通子字符串。
// This comes straight from Wikipedia article linked above:
private static string FindLcs(string s, string t) {
var L = new int[s.Length, t.Length];
var z = 0;
var ret = new StringBuilder();
for (var i = 0 ; i != s.Length ; i++) {
for (var j = 0 ; j != t.Length ; j++) {
if (s[i] == t[j]) {
if (i == 0 || j == 0) {
L[i,j] = 1;
} else {
L[i,j] = L[i-1,j-1] + 1;
}
if (L[i,j] > z) {
z = L[i,j];
ret = new StringBuilder();
}
if (L[i,j] == z) {
ret.Append(s.Substring( i-z+1, z));
}
} else {
L[i,j]=0;
}
}
}
return ret.ToString();
}
// With the LCS in hand, building the answer is easy
public static string CutLcs(string s, string t) {
for (;;) {
var lcs = FindLcs(s, t);
if (lcs.Length < 10) break;
s = s.Replace(lcs, string.Format("[{0}]", lcs.Length));
}
return s;
}
关于c# - 使用C#查找和替换字符串中的文本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12169496/