1

以下のようなスクリプトファイルがあります

[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]

ところで、linqでそれを行うことはできますか?

4

3 に答える 3

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、またはその他のよく使用されるフォーマットを使用するだけです。

于 2013-04-22T15:46:34.867 に答える
0

次の式を試してください。

string gradeKeyword = "\\[level\\]\\r\\n([^\\[].+\\r\\n)+";
于 2013-04-22T15:20:40.587 に答える