正则表达式从后向替换

时间:2014-12-27 08:42:23

标签: c# regex

假设我有如下字符串:

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

下面的代码不会起作用,最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

使用下面的负面后瞻断言,

(?<!'http://www\.example\.net)(/Files\b)

然后用http://www.example.net$1替换匹配的字符。

(?<!'http://www\.example\.net)  负面观察,断言匹配不会以'http://www.example.net开头。

DEMO1 DEMO2

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();

IDEONE