在文件行中使用正则表达式查找匹配项

时间:2014-06-23 22:44:10

标签: c#

我正在从目录中读取文件列表并查找模式:

A. [[[Something]]] > Get the string "Something"

B. [[[Something///Comment]]] > Get the strings "Something" and "Comment"

C. [[[Enter between %0 and %1 characters|||Val 1|||Val 2]]] >> Get the string before the first ||| which is "Enter between %0 and %1 characters"

所以我尝试了以下内容:

IList<String> files = Directory.GetFiles(path, "*.cshtml", SearchOption.AllDirectories).ToList();

IDictionary<String, Tuple<Int32, String>> items = new Dictionary<String, Tuple<Int32, String>>();

Regex regex = new Regex(@"\[\[\[.*\]\]\]");

foreach (String file in files) {

  foreach (String line in File.ReadAllLines(file)) {

    MatchCollection matches = regex.Matches(line);

    foreach (Match match in matches) {

      if (match != null) {
        items.Add(match.Value, new Tuple<Int32, String>(number, file));
      }

    }

  }

}

注意:我正在使用ReadAllLines,因为我需要获取我找到的每个匹配的行号。

我可以在以下方面获得一些帮助:

  1. 使用正则表达式@“[[[。*]]]时”我发现了一种情况不起作用:

    ViewInfo.Title( “[[[标题]]]”)说明( “[[[描述]]]”);

    我得到标题]]]“)。描述(”[[[Description]]]

  2. 我无法应用规则(B)和(C)。

  3. 是否可以提高性能或我的代码没问题?

1 个答案:

答案 0 :(得分:1)

  1. 您需要一个不明确的表达方式:.*?会尝试使用尽可能少的字符

  2. 试试这个:@"\[\[\[(?:(.*?)\|\|\|.*?|(.*?)///(.*?)|(.*?))\]\]\]"(重要的是先放置最长的替代品,否则.*?可能会占用整个字符串)

  3. 使用File.ReadLines以及在每次迭代时递增的变量来计算行数。这样你就不必将整个文件保存在内存中。