我在做什么毛病我的正则表达式?(What am I doing wrong with my Rege

2019-10-18 08:13发布

我不知道我做错了。 我试图使用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标签。

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

在我的代码我首先替换关键字meta标签

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

这工作让我的下一个任务是用它来取代描述meta标签

<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**
    -->

谢谢

Answer 1:

要回答没有无用的生命吸取你的问题,你有因为贪婪量词的烦恼。 尝试通过添加问号使他们懒惰:

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

当然这个正则表达式不会为世界上所有的网页工作,但如果你只需要进行一些快速更换脚本自己的模板,正则表达式是最快和最简单的解决方案,要走的路。



Answer 2:

你在做什么错? 您解析HTML用正则表达式 !

对于.NET库推荐: HTML敏捷性包



Answer 3:

我同意@ serg555的答案 - 问题是贪心量词 - 使他们懒惰与“?” 要解决这个问题

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


Answer 4:

学习,爱情,并使用DOM。 它是W3C(HTML标准组织)认可的方式来解析XML(HTML是XML的一个子集)的文件。 除非你有足够的理由相信您输入HTML是可怕的错误,这通常是开始的最好方法。

了解这里

你是高度鼓励退房演练:从C#访问DHTML DOM

你也可以尝试jQuery的,因为它可以很容易搜索DOM。 像这样 。



Answer 5:

我需要在C#代码URL的描述和使用本网站来检查我的正则表达式的代码。

这是我最后的这知府的工作:

      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;


文章来源: What am I doing wrong with my Regex?