2014-12-27 2 views
0

Предположим, у меня была строка, как показано ниже:Regex Заменить с обратные

string signature = "<img src='/Files/A.jpg' />" + 
"<img src='http://www.example.net/Files/A.jpg' />" + 
"<img src='/Files/A.jpg' />"; 

Я хочу, чтобы заменить ниже строку перед «Files», если ниже фраза не выходит:

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

Он найдет индекс «Files» и двигаться в обратном направлении, чтобы проверить, является ли URL-адрес выходов, или нет. если URL не завершает работу, он заменит URL до «/ Files», но он порывает с execption ниже:

Index and length must refer to a location within the string 

Код ниже не будет работать, что это лучший способ сделать это?

ответ

0

Используйте отрицательное утверждение, как назад 'ниже,

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

Затем замените совпавшие символы с http://www.example.net$1.

(?<!'http://www\.example\.net) Отрицательный lookbehind, который утверждает, что совпадению не будет предшествовать 'http://www.example.net.

DEMO1DEMO2

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

Смежные вопросы