2012-07-14 101 views
0

解析我使用下面的正則表達式匹配下面的語句組:無法從正則表達式

@import URL(normalize.css); @import url(style.css); @import url(helpers.css);

/// <summary> 
    /// The regular expression to search files for. 
    /// </summary> 
    private static readonly Regex ImportsRegex = new Regex(@"@import\surl\(([^.]+\.css)\);", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace); 

這是我的匹配聲明,但,當我試圖讓組了我的比賽,我得到完整的結果,而不是我期待的價值。

e.g預期的結果normalize.css 實際結果@import url(normalize.css);

做到這一點的代碼如下。誰能告訴我我做錯了什麼?

/// <summary> 
    /// Parses the string for css imports and adds them to the file dependency list. 
    /// </summary> 
    /// <param name="css"> 
    /// The css to parse. 
    /// </param> 
    private void ParseImportsToCache(string css) 
    { 
     GroupCollection groups = ImportsRegex.Match(css).Groups; 

     // Check and add the @import params to the cache dependancy list. 
     foreach (string groupName in ImportsRegex.GetGroupNames()) 
     { 
      // I'm getting the full match here?? 
      string file = groups[groupName].Value; 

      List<string> files = new List<string>(); 
      Array.ForEach(
       CSSPaths, 
       cssPath => Array.ForEach(
        Directory.GetFiles(
         HttpContext.Current.Server.MapPath(cssPath), 
         file, 
         SearchOption.AllDirectories), 
        files.Add)); 

      this.cacheDependencies.Add(new CacheDependency(files.FirstOrDefault())); 
     } 
    } 
+0

你爲什麼要遍歷所有的組時,你只能似乎想的羣體之一?這似乎是一種非常複雜的方式來實現你想要的。 – 2012-07-14 21:58:27

+0

我只想要文件的第一個實例。我得到了Directory.GetFiles方法返回的第一個實例。循環有點混亂。你可以責怪Resharper。 – 2012-07-14 22:00:14

回答

3

你應該總是指出你正在尋找的正則表達式。 (?:exp)用於非捕獲組,而()用於捕獲組。您也可以給他們的名字,像(?<name>exp)

你的正則表達式更改爲(?:@import\surl\()(?<filename>[^.]+\.css)(?:\);)並捕捉它像

pRegexMatch.Groups["filename"].Captures[0].Value.Trim(); 

希望這有助於。

問候

+0

嚮導!這很有用! – 2012-07-14 22:09:22

+1

非常歡迎=) – 2012-07-14 22:09:39

1

而是反覆遍歷組。你的第二場比賽將是內在的一場比賽。

0

你必須確定的組名這樣的:

Regex.Matches(@"@import\surl\((?<yourGroupname)[^.]+\.css)\);"