我正在从目录中读取文件列表并查找模式:
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,因为我需要获取我找到的每个匹配的行号。
我可以在以下方面获得一些帮助:
使用正则表达式@“[[[。*]]]时”我发现了一种情况不起作用:
ViewInfo.Title( “[[[标题]]]”)说明( “[[[描述]]]”);
我得到标题]]]“)。描述(”[[[Description]]]
我无法应用规则(B)和(C)。
是否可以提高性能或我的代码没问题?
答案 0 :(得分:1)
您需要一个不明确的表达方式:.*?
会尝试使用尽可能少的字符。
试试这个:@"\[\[\[(?:(.*?)\|\|\|.*?|(.*?)///(.*?)|(.*?))\]\]\]"
(重要的是先放置最长的替代品,否则.*?
可能会占用整个字符串)
使用File.ReadLines
以及在每次迭代时递增的变量来计算行数。这样你就不必将整个文件保存在内存中。