假设我有如下字符串:
string signature = "<img src='/Files/A.jpg' />" +
"<img src='http://www.example.net/Files/A.jpg' />" +
"<img src='/Files/A.jpg' />";
我想在&#39; Files&#39;之前替换下面的字符串。如果以下短语不退出:
var url = "http://www.example.net";
所以最终的结果是这样的:
string signature = "<img src='http://www.example.net/Files/A.jpg' />" +
"<img src='http://www.example.net/Files/A.jpg' />" +
"<img src='http://www.example.net/Files/A.jpg' />";
请注意,第二行不会替换,因为它有url。所以我写的代码是:
string signature = "<img src='/Files/A.jpg' />" +
"<img src='http://www.example.net/Files/A.jpg' />" +
"<img src='/Files/A.jpg' />";
var url = "http://www.example.net";
string pattern = "Files";
Match m = Regex.Match(signature,pattern,RegexOptions.Multiline);
while (m.Success)
{
int backward = m.Index-url.Length + 6;
if (backward < 0) backward = 0;
string fromLastSrc = signature.Substring(backward, m.Index);
if (!fromLastSrc.Contains(url))
{
signature = signature.Insert(m.Index - 1, url);
}
m = m.NextMatch();
}
它会找到&#39;文件&#39;索引并向后移动以检查url是否退出。如果网址没有退出,则会在&#39; / Files&#39;之前替换网址。 ,但它打破了以下的执行:
Index and length must refer to a location within the string
下面的代码不会起作用,最好的方法是什么?
答案 0 :(得分:0)
使用下面的负面后瞻断言,
(?<!'http://www\.example\.net)(/Files\b)
然后用http://www.example.net$1
替换匹配的字符。
(?<!'http://www\.example\.net)
负面观察,断言匹配不会以'http://www.example.net
开头。
string signature = "<img src='/Files/A.jpg' />" +
"<img src='http://www.example.net/Files/A.jpg' />" +
"<img src='/Files/A.jpg' />";
string result = Regex.Replace(signature, @"(?<!'http://www\.example\.net)(/Files\b)", "http://www.example.net$1");
Console.WriteLine(result);
Console.ReadLine();