我不知道我在做什麼錯。我正在嘗試使用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 name=\"description\" content=\"D\" />
這不更換描述meta標籤而是替代「關鍵字」元標記,然後替換「描述」標記。
這是我的測試程序,所以你們都可以嘗試一下。只需通過它在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**
-->
感謝
嗯,這有效,但我不明白。我認爲即使我正在使用一個貪婪的量詞,它會一直持續到它看到「/>」並停止。那麼爲什麼它會更進一步呢?即使在檢查這個被捕獲的表達式時,它總是會返回一個。 – chobo2 2009-11-17 16:46:25