2010-05-04 85 views
0

我想从视图页面提取MasterPage值指令。我想要最快的方式来做到这一点,考虑到一个非常大的aspx页面,以及一个非常小的。使用正则表达式从字符串中提取字符串

我认为最好的办法是做有两个阶段:

  1. 提取从视图页面指令部分(使用正则表达式):
    <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

  2. 然后,提取值里面MasterPageFile属性。

结果需要是:~/Views/Shared/Site.Master

我可以从某人的帮助下实施吗?我非常想只使用正则表达式,但我不是正则表达式专家。

另一件事,你认为正则表达式是最快的方法吗?

回答

1

这里是相匹配的Page指令,将有1组的MasterPageFile属性值的正则表达式:

<%@\s?Page.*?MasterPageFile="([^"]+)".*?%>$ 

你为什么需要它?如果在运行时显示页面时需要了解MasterPageFile,则可以使用更简单快捷的方式来完成此操作。

+0

我构建了一个自动化测试代码,用于测试大量视图页面。你认为这是最快的方法吗?在一个非常大的aspx文件中,正则表达式可能会扫描全部页面,或者它是否优化为仅查找第一个匹配的大小写(在本例中为页面指令块)。谢谢! – stacker 2010-05-04 17:27:00

+0

如果.aspx非常大,您可能只想读取第一个_n_行,然后在其上运行正则表达式。然后你只有很少的正则表达式可以操作,你将花更少的时间来加载页面。磁盘IO往往比CPU慢:-) – driis 2010-05-04 17:36:12

+0

Regex.Match方法将返回第一个匹配项,然后停止搜索。 – driis 2010-05-04 17:37:29

1
string a = "<%@ Page Language=\"C#\" MasterPageFile=\"~/Views/Shared/Site.Master\" Inherits=\"System.Web.Mvc.ViewPage\" %>"; 

    Regex r = new Regex("<%@.*MasterPageFile=\"([^\"]*)\".*%>", RegexOptions.Compiled); 
    Match m = r.Match(a); 
    if (m.Success) 
    { 
     // what you want is in m.Groups[1] 
    } 

组是包含匹配部分的字符串数组。组[0]是整个匹配,其余部分将包含在正则表达式中的括号内。如上所述,我用圆括号包围了你想要的部分。

+0

搜索需要在页面指令结束后停止。 – stacker 2010-05-04 17:56:48

+0

谢谢你的帮助! – stacker 2010-05-04 17:57:12

相关问题