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);

这与我的陈述相匹配,但是当我试图让这些组脱离我的比赛时,我得到的是完整的结果,而不是我期望的值。

例如预期结果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()));
        }
    }
4

3 回答 3

3

您应该始终将您的正则表达式表示为您要查找的内容。(?:exp)用于非捕获组,而()用于捕获组。你也可以给他们起名字,比如(?<name>exp)

将您的正则表达式更改为(?:@import\surl\()(?<filename>[^.]+\.css)(?:\);)并像这样捕获它

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

希望这可以帮助。

问候

于 2012-07-14T22:02:44.707 回答
1

而是迭代组。您的第二场比赛将是内部比赛。

于 2012-07-14T21:58:28.327 回答
0

您必须像这样确定组名:

Regex.Matches(@"@import\surl\((?<yourGroupname)[^.]+\.css)\);"
于 2012-07-14T22:09:46.933 回答