C# 我想用c中的正则表达式解析我的脚本文件

C# 我想用c中的正则表达式解析我的脚本文件,c#,regex,C#,Regex,我有一个脚本文件,如下所示 [grade] `[achievement]` [gold multiple] 250 [level] 34 99 [pre required quest] 38 [/pre required quest] 例如: lex("grade") return "`[achievement]`" lex("level") return "34,99" 也许我能靠林克做到,但我找不到办法 我试过了 scripts = File.ReadAllText(script

我有一个脚本文件,如下所示

[grade]
`[achievement]`

[gold multiple]
250

[level]
34
99

[pre required quest]
38
[/pre required quest]
例如:

lex("grade") return "`[achievement]`"

lex("level") return "34,99"
也许我能靠林克做到,但我找不到办法

我试过了

scripts = File.ReadAllText(scriptFilePath);
string gradeKeyword = @"(?<=\[grade\]\r\n).*?\r\n*(?=\[.*\]\r\n)"
Regex reg = new Regex(gradeKeyword);
Match mat = reg.Match(scripts);
我想得到的[成就]不起作用


顺便说一句,我可以通过linq实现吗?

.NET正则表达式默认为不跨换行符匹配。您必须指定该选项。

.NET正则表达式默认为不跨换行符匹配。您必须指定该选项。

请尝试以下表达式:

string gradeKeyword = "\\[level\\]\\r\\n([^\\[].+\\r\\n)+";

尝试以下表达式:

string gradeKeyword = "\\[level\\]\\r\\n([^\\[].+\\r\\n)+";

您可以尝试不使用正则表达式

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或其他一些常用格式,而不是使用我自己的格式。

您可以尝试不使用正则表达式

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或其他一些常用格式,而不是使用我自己的格式。

您能更好地定义输入格式吗。它并非完全没有歧义。似乎有些标签只需要打开,但有些(如预先要求的任务)也需要关闭。我同意@spender的观点-您可以更改输入文件格式吗?XML或类似的格式更适合这种情况。您能更好地定义输入格式吗。它并非完全没有歧义。似乎有些标签只需要打开,但有些(如预先要求的任务)也需要关闭。我同意@spender的观点-您可以更改输入文件格式吗?XML或类似的语言更适合这种情况。+1用于YAML,而不是使用自己的脚本系统。其他人发明的东西几乎总是更容易,也可能更好。+1用于在出现问题时不使用正则表达式。+1用于YAML,而不是滚动您自己的脚本系统。其他人发明的东西几乎总是更容易,也可能更好。+1用于在出现问题时不使用正则表达式。