我的正则表达式出了什么问题?

时间:2009-11-17 06:40:58

标签: c# .net regex .net-3.5

我不确定我做错了什么。我正在尝试使用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\" />

这不起作用,而是替换“keywords”元标记,然后替换“description”标记。

这是我的测试程序,所以你们都可以尝试一下。在C#console app中通过它。

  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 个答案:

答案 0 :(得分:7)

你做错了什么?你是parsing HTML with a regex

推荐的.NET库:HTML Agility Pack

答案 1 :(得分:6)

为了回答你的问题而没有无用的生活课程,你因为贪婪的量词而遇到了麻烦。尝试通过添加问号使它们变得懒惰:

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

当然这个正则表达式不适用于世界上所有页面,但如果您只需要为自己的模板制作一些快速替换脚本,那么正则表达式是最快速,最简单的解决方案,也是最佳选择。

答案 2 :(得分:1)

我同意@ serg555的答案 - 问题在于贪婪的量词 - 让他们懒得用'?'应该解决问题

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

答案 3 :(得分:0)

学习,喜爱和使用DOM。它是W3C(HTML标准组织)批准的解析XML(HTML是XML的子集)文档的方法。除非你有足够的理由相信你的输入HTML是非常错误的,否则这通常是最好的方法。

Learn here

强烈建议您退房 Walkthrough: Accessing the DHTML DOM from C#

您可能还想尝试jQuery,因为它可以很容易地搜索DOM。 Like so

答案 4 :(得分:0)

我需要在C#代码中描述网址,并使用this site来检查我的正则表达式代码。

这是我的最终作品:

      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;