c # регулярное выражение, чтобы найти и заменить повторное использование совпадающего текста - PullRequest
3 голосов
/ 30 апреля 2009

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

<a href="http://any.url.here/%7BlocalLink:1369%7D%7C%7CThank%20you%20for%20registering">broken link</a>

и исправьте это так:

<a href="/{localLink:1369}" title="Thank you for registering">link</a>

В текстовом поле может быть несколько таких неработающих ссылок. Моя трудность заключается в том, чтобы решить, как повторно использовать соответствующий идентификатор (в данном случае 1369). В содержании этот идентификатор изменяется от ссылки к ссылке, как и URL-адрес и текст ссылки.

Спасибо

David

РЕДАКТИРОВАТЬ: Чтобы уточнить, я пишу код C # для запуска через сотни длинных текстовых полей, чтобы исправить в них неработающие ссылки. Каждое отдельное текстовое поле содержит html, который может содержать любое количество неработающих ссылок - регулярное выражение должно найти их все и заменить на правильную версию ссылки.

Ответы [ 4 ]

2 голосов
/ 30 апреля 2009

Чтобы включить совпадение в строку замены, вы используете $&.

Существует ряд других маркеров замещения, которые можно использовать в строке замены, см. Здесь список .

2 голосов
/ 30 апреля 2009

Примите это с недоверием, HTML и Regex не очень хорошо играют вместе:

(<a\s+[^>]*href=")[^"%]*%7B(localLink:\d+)%7D%7C%7C([^"]*)("[^>]*>[^<]*</a>)

Применительно к вашему вводу и замене на

$1/{$2}" title="$3$4

производится следующее:

<a href="/{localLink:1369}" title="Thank%20you%20for%20registering">broken link</a>

Это так же близко, как и к одному регулярному выражению. Вам нужно будет использовать MatchEvaluator делегат , чтобы удалить кодировку URL из замены.

2 голосов
/ 30 апреля 2009

Я предполагаю, что вы уже проанализировали элемент и атрибуты. Таким образом, чтобы обработать URL, используйте что-то вроде этого:

    string url = "http://any.url.here/%7BlocalLink:1369%7D%7C%7CThank%20you%20for%20registering";
    Match match = Regex.Match(HttpUtility.UrlDecode(url), @"^http://[^/]+/\{(?<local>[^:]+):(?<id>\d+)\}\|\|(?<title>.*)$");
    if (match.Success) {
        Console.WriteLine(match.Groups["local"].Value);
        Console.WriteLine(match.Groups["id"].Value);
        Console.WriteLine(match.Groups["title"].Value);
    } else {
        Console.WriteLine("Not one of those URLs");
    }
1 голос
/ 06 мая 2009

Спасибо всем за помощь. Вот что я использовал в конце:

const string pattern = @"(<a\s+[^>""]*href="")[^""]+(localLink:\d+)(?:%7[DC])*([^""]+)(""[^>]*>[^<]*</a>)";
// Create a match evaluator to replace the matched links with the correct markup
var myEvaluator = new MatchEvaluator(FixLink);

var strNewText = Regex.Replace(strText, pattern, myEvaluator, RegexOptions.IgnoreCase);

internal static string FixLink(Match m)
    {
        var strUrl = m.ToString();
        const string namedPattern = @"(<a\s+[^>""]*href="")[^""]+(localLink:\d+)(?:%7[DC])*([^""]+)(""[^>]*>[^<]*</a>)";
        var regex = new Regex(namedPattern);

        //const string strReplace = @"$1/{$2}"" title=""$4";
        const string strReplace = @"$1/{$2}"" title=""$4";

        HttpContext.Current.Response.Write(String.Format("Replacing '{0}' with '{1}'", strUrl, regex.Replace(strUrl, strReplace)));
        return regex.Replace(strUrl, strReplace);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...