Что я делаю не так с моим Regex? - PullRequest
1 голос
/ 17 ноября 2009

Я не уверен, что я делаю неправильно. Я пытаюсь использовать asp.net regex.replace, но он продолжает заменять неправильный элемент.

У меня 2 замены. Первый делает то, что я хочу, он заменяет то, что я хочу. Следующая замена, которая является почти зеркальным отображением, не заменяет то, что я хочу.

Так вот мой пример кода

<%@ Page Title="Tour" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
    <title>Website Portfolio Section - VisionWebCS</title>
    <meta name="description" content="A" />
    <meta name="keywords" content="B" />
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <!-- **START** -->

Я хочу заменить оба метатега.

<meta name=\"description\" content=\"A\" />
<meta name=\"keywords\" content=\"B\" />

Сначала я заменяю метатег ключевых слов на

.
<meta name=\"keywords\" content=\"C\" />

Это работает, поэтому моя следующая задача - заменить метатег описания на этот

<meta name=\"description\" content=\"D\" />

Это не работает, вместо этого он заменяет метатег "ключевые слова", а затем заменяет тег "описание".

Вот моя тестовая программа, так что вы все можете попробовать ее. Просто через это в C # консольном приложении.

  private const string META_DESCRIPTION_REGEX = "<\\s* meta \\s* name=\"description\" \\s* content=\"(?<Description>.*)\" \\s* />";
        private const string META_KEYWORDS_REGEX = "<\\s* meta \\s* name=\"keywords\" \\s* content=\"(?<Keywords>.*)\" \\s* />";
        private static RegexOptions regexOptions = RegexOptions.IgnoreCase
                                   | RegexOptions.Multiline
                                   | RegexOptions.CultureInvariant
                                   | RegexOptions.IgnorePatternWhitespace
                                   | RegexOptions.Compiled;

        static void Main(string[] args)
        {

            string text = "<%@ Page Title=\"Tour\" Language=\"C#\" MasterPageFile=\"~/Views/Shared/Site.Master\" Inherits=\"System.Web.Mvc.ViewPage\" %><asp:Content ID=\"Content1\" ContentPlaceHolderID=\"HeadContent\" runat=\"server\">    <title>Website Portfolio Section - VisionWebCS</title>    <meta name=\"description\" content=\"A\" />    <meta name=\"keywords\" content=\"B\" /></asp:Content><asp:Content ID=\"Content2\" ContentPlaceHolderID=\"MainContent\" runat=\"server\"><!-- **START** -->";
            Regex regex = new Regex(META_KEYWORDS_REGEX, regexOptions);
            string newKeywords = String.Format("<meta name=\"keywords\" content=\"{0}\" />", "C");
            string output = regex.Replace(text, newKeywords);

            Regex regex2 = new Regex(META_DESCRIPTION_REGEX, regexOptions);
            string newDescription = String.Format("<meta name=\"description\" content=\"{0}\" />", "D");
            string newOutput = regex2.Replace(output, newDescription);
            Console.WriteLine(newOutput);
        }

Это дает мне окончательный результат

<%@ Page Title="Tour" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ID="Content1" ContentPlaceHold erID="HeadContent" runat="server">
    <title>Website Portfolio Section - VisionW
        ebCS</title>
    <meta name="description" content="D" />
</asp:Content>
<asp:Conten t ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <!-- **START**
    -->

Спасибо

Ответы [ 5 ]

7 голосов
/ 17 ноября 2009

Что ты делаешь не так? Вы анализируете HTML с помощью регулярного выражения !

Рекомендуемая библиотека для .NET: HTML Agility Pack

6 голосов
/ 17 ноября 2009

Чтобы ответить на ваш вопрос без лишних жизненных уроков, у вас возникли проблемы из-за жадных квантификаторов. Попробуйте сделать их ленивыми, добавив знаки вопроса:

<meta\\s+?name=\"description\"\\s+?content=\"(?<Description>.*?)\"\\s*?/>

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

1 голос
/ 17 ноября 2009

Я согласен с ответом @ serg555 - проблема связана с жадными квантификаторами - ленивыми с "?" должен решить проблему

<meta\\s*name=\"description\"\\s*content=\"(?<Description>.*?)\"\\s*/>
0 голосов
/ 30 января 2017

Мне нужно было описание URL в коде C # и я использовал этот сайт , чтобы проверить мой код Regex.

это мой последний префект работы:

      WebClient x = new WebClient { Encoding = Encoding.UTF8 };
            string source = x.DownloadString(url);

            string description = Regex.Match(source, "<meta[^>]*name=[\"|\']description[\"|\'][^>]*content=[\"]([^\"]*)[\"][^>]*>", RegexOptions.IgnoreCase).Groups[1].Value;
0 голосов
/ 17 ноября 2009

Учитесь, любите и используйте DOM. Это одобренный W3C (тело стандартов HTML) способ анализа документов XML (HTML является подмножеством XML). Если у вас нет достаточных оснований полагать, что введенный вами HTML-код ужасно неправильный, обычно лучше начать с этого.

Узнайте здесь

Вам настоятельно рекомендуется проверить Пошаговое руководство. Доступ к DHTML DOM из C #

Возможно, вы также захотите попробовать jQuery, поскольку он упрощает поиск в DOM. Вроде так .

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