2009-05-09 3 views
1

Как я могу написать регулярное выражение для замены ссылок без текста ссылки, как это:Как написать регулярное выражение для захвата ссылок без текста ссылки?

<a href="http://www.somesite.com"></a> 

с

<a href="http://www.somesite.com">http://www.somesite.com</a> 

?

Это то, что я пытался сделать, чтобы захватить матчи, и это не ловушка. Что я делаю не так?

string pattern = "<a\\s+href\\s*=\\s*\"(?<href>.*)\">\\s*</a>"; 

ответ

2

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

string pattern = @"<a\s+href\s*=\s*""(?<href>.*?)"">\s*</a>"; 

(Я также изменил тип строковый литерал использовать @, для лучшей читаемости.)

Остальная часть регулярного выражения появляется штраф мне. То, что вы не собираете никаких совпадений, заставляет меня думать иначе, но может быть проблема в остальной части кода (или даже в исходных данных - вы это подтвердили?).

1

Я хотел бы предложить

string pattern = "(<a\\b[^>]*href=\"([^\"]+)\"[^>]*>)[\\s\\r\\n]*(</a>)"; 

Этот способ также связывает их атрибут href где-то еще будет захвачен.

Заменить

"$1$2$3" 

Обычное слово предупреждения: HTML и регулярное выражение, по существу несовместимы. Используйте с осторожностью, это может взорваться.

8

Я бы не использовать регулярное выражение, - я бы использовать Html Agility Pack и запрос типа:

foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[.='']")) { 
    link.InnerText = link.GetAttribute("href"); 
} 
+0

+1 для моей ежедневной дозы обучения чему-то новому. – womp

+1

+1 для избежания залегания реджекса. – Tomalak

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