我有一个如下所示的脚本文件
[grade]
`[achievement]`
[gold multiple]
250
[level]
34
99
[pre required quest]
38
[/pre required quest]
例如:
lex("grade") return "`[achievement]`"
lex("level") return "34,99"
可能是我可以通过linq做到的,但我找不到方法
我试过
scripts = File.ReadAllText(scriptFilePath);
string gradeKeyword = @"(?<=\[grade\]\r\n).*?\r\n*(?=\[.*\]\r\n)"
Regex reg = new Regex(gradeKeyword);
Match mat = reg.Match(scripts);
它不起作用(我想得到[achievement]
)
答案 0 :(得分:4)
您可以尝试不使用正则表达式。
public static IEnumerable<string> GetScriptSection(string file, string section)
{
var startMatch = string.Format("[{0}]", section);
var endMatch = string.Format("[/{0}]", section);
var lines = file.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToList();
int startIndex = lines.FindIndex(f => f == startMatch) + 1;
int endIndex = lines.FindLastIndex(f => f == endMatch);
if(endIndex == -1)
{
endIndex = lines.FindIndex(startIndex, f => f.StartsWith("[") && lines.IndexOf(f) > startIndex);
endIndex = endIndex == -1 ? lines.Count : endIndex;
}
return lines.GetRange(startIndex, endIndex - startIndex).Where(l => !string.IsNullOrWhiteSpace(l)).ToList();
}
但我会使用YAML,XML或其他一些使用得很好的格式,而不是自己动手。
答案 1 :(得分:0)
.NET正则表达式默认不匹配换行符。您必须指定RegexOptions.SingleLine选项。
答案 2 :(得分:0)
尝试以下表达式:
string gradeKeyword = "\\[level\\]\\r\\n([^\\[].+\\r\\n)+";