Как я могу избежать замены конкретного строкового шаблона на Regex.replace () - PullRequest
1 голос
/ 06 мая 2010

У меня есть строка вроде
Pakistan, officially the <a href="Page.aspx?Link=Islamic Republic of Pakistan">Islamic Republic of Pakistan</a>

Теперь я использую
System.Text.RegularExpressions.Regex.Replace(inputText, "(\\bPakistan\\b)", "something"); заменить Пакистан вне тегов. Но я не хочу заменять Пакистан, встречающийся в тегах <a></a>.
Редактировать: фактическая строка

Пакистан (урду: )اکِستان), официально Исламская Республика Пакистан, является страна в южной азии. Оно имеет 1046 км (650 миль) береговой линии вдоль Аравийского моря и Оманского залива на юге и граничит с Афганистан и Иран на западе, Индия на востоке и Китай на дальнем к северо-востоку. [6] Таджикистан тоже лжет очень близко к Пакистану, но разделенный узким Ваханом Коридор.


И массив строк

string[] links={"Pakistan","Islamic Republic","Republic of Pakistan","South Asia","Arabian Sea","Gulf","Oman","Gulf of Oman","the south","in the south","Afghanistan","Iran","the west","in the west","west India","the east","China","Tajikistan","the narrow","Wakhan Corridor","Central Asia","the Middle","Middle East","the Middle East"}

Я хочу заменить каждое вхождение каждой строки в этом массиве на <a href="page.aspx?link=thisString">thisString</a>. и я не могу правильно добавить ссылки на строки типа «Республика Пакистан», где Пакистан также является другой строкой в ​​этом массиве.

Ответы [ 5 ]

2 голосов
/ 06 мая 2010

Для первой части вашего вопроса я бы сопоставил или ссылку или целевое слово:

Regex r = new Regex(@"<a\s+.*?</a>|\bPakistan\b");

Тогда я бы использовал MatchEvaluator, чтобы проверить, какой из них соответствовал, и соответственно заменить: если это ссылка, подключите ее обратно; если это целевое слово, свяжите его.

Для второй части вы можете Join строк в массиве в чередовании регулярных выражений, например:

string regex = String.Format(@"\b({0})\b", String.Join("|", links));

Просто помните, что чередование возвращает первую подходящую альтернативу, а не самую длинную. Если любая альтернатива A является префиксом альтернативы B , B должны быть перечислены перед A . Например, the Middle East должно стоять перед the Middle в вашем списке.

2 голосов
/ 06 мая 2010

Если вы пытаетесь что-то сделать в контексте синтаксиса HTML, используйте анализатор HTML.

1 голос
/ 06 мая 2010

Хотя решение @Chris здесь не работает точно, но вы можете использовать его таким образом.

string content = "Pakistan is <a href=\" Pakistan is\">Pakistan an islamic country</a>";
string content2= Regex.Replace(content,@"\bPakistan\b", "India");
string content3 = Regex.Replace(content2, @"(?<=\<\s*a[^<]+)\bIndia\b(?=.*?\>)", "pakistan");        
Console.WriteLine(content3);    

но это не очень эффективное решение.

1 голос
/ 06 мая 2010

Вот как вы можете сделать противоположное тому, что вы просите (замените только экземпляры внутри тегов):

content = Regex.Replace(content, @"(?<=\<\s*a[^>]+)\bPakistan\b(?=.*?\>)", "India");

Это очень непроверенный и не тот, который вы хотите, но он может дать вам несколько советов. При этом используются обратные утверждения нулевой ширины . Я уверен, что есть много других способов сделать это.

Это действительно расширяет границы регулярных выражений. Вам, вероятно, следует использовать анализатор HTML.

Редактировать: используя отрицательный взгляд, это работает (пожалуйста, проверьте!):

content = Regex.Replace(content, @"(?<!\<\s*a[^>]+)\bPakistan\b", "India");
0 голосов
/ 06 мая 2010

Получить каждую строку текста в строку A

Удалить бит между <a></a> и сохранить его в строке B

Запустите Regex для оставшегося текста в строке A

возврат A + B

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...