Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建正则表达式来解析按关键字分组的列表_C#_Regex - Fatal编程技术网

C# 如何创建正则表达式来解析按关键字分组的列表

C# 如何创建正则表达式来解析按关键字分组的列表,c#,regex,C#,Regex,我很难让正则表达式正常工作。我想解析这样一个列表 Teacher teacher name Class class name student full name 1 student full name 2 Teacher teacher name Class class name student full name 1 student full name 2 Class class name student full name 1 student full name 2 Teacher te

我很难让正则表达式正常工作。我想解析这样一个列表

Teacher teacher name Class class name student full name 1 student full name 2 Teacher teacher name Class class name student full name 1 student full name 2 Class class name student full name 1 student full name 2 Teacher teacher name Class class name student full name 1 student full name 2 教师姓名 类名 学生全名1 学生全名2 教师姓名 类名 学生全名1 学生全名2 类名 学生全名1 学生全名2 教师姓名 类名 学生全名1 学生全名2 我想检索一个包含一名教师的组列表,每个教师包含一些类,每个类包含一些学生。 “教师”和“班级”是关键词。如果这一行不是这些,那么它将是上一个班级的学生

最接近我的是
Teacher\t(+?)\t*$(^Class\t(+?)\t*$(^.+\t*$)*
,但没有成功。但它并不符合“教师群体”的内在内容


我总是可以选择编写for循环,但我真的很想学习如何使用regex实现它。请帮我写这个正则表达式

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

Teacher[ \f\t\v]([^\n\r]+)\r?\n(?:Class[ \f\t\v]([^\n\r]+)\r?\n(?:student[ \f\t\v]([^\n\r]+)\r?\n)*)*

然后,您可以使用组和捕获来查找教师、班级和学生。要匹配哪个学生进入哪个班级,您必须检查捕获索引并对其进行适当排序。

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

Teacher[ \f\t\v]([^\n\r]+)\r?\n(?:Class[ \f\t\v]([^\n\r]+)\r?\n(?:student[ \f\t\v]([^\n\r]+)\r?\n)*)*

然后,您可以使用组和捕获来查找教师、班级和学生。要匹配哪个学生进入哪个班级,您必须检查捕获的索引并对其进行适当排序。

我认为您需要定义语法。考虑使用或其他解析器生成器。< BR/> 但是,您可以使用正则表达式和一些额外的C代码进行解析#

定义您的模型:

public class Teacher
{
    public string Name { get; set; }
    public List<Class> Classes { get; set; } = new List<Class>();
}

public class Class
{
    public string Name { get; set; }
    public List<Student> Students { get; set; } = new List<Student>();
}

public class Student
{
    public string Name { get; set; }
}
公共课堂教师
{
公共字符串名称{get;set;}
公共列表类{get;set;}=new List();
}
公共课
{
公共字符串名称{get;set;}
公共列表学生{get;set;}=new List();
}
公立班学生
{
公共字符串名称{get;set;}
}
然后分析您的输入:

var lineParser = new Regex("^(?<kind>Teacher|Class|)\\s*(?<name>[^$]+)");
var lines = input.Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
    .Select(line =>
    {
        var match = lineParser.Match(line);
        var kind = match.Groups["kind"].Value;
        var name = match.Groups["name"].Value;
        return new { kind, name };
    });

var teachers = new List<Teacher>();
foreach (var line in lines)
{
    if (line.kind == "Teacher")
        teachers.Add(new Teacher {Name = line.name});
    else if (line.kind == "Class")
        teachers.Last().Classes.Add(new Class {Name = line.name});
    else
        teachers.Last().Classes.Last().Students.Add(new Student {Name = line.name});
}
var lineParser=newregex(“^(?Teacher | Class |)\\s*(?[^$]+)”;
var lines=input.Split(“\r\n”.ToCharArray(),StringSplitOptions.RemoveEmptyEntries)
.选择(行=>
{
var match=lineParser.match(line);
var kind=match.Groups[“kind”].Value;
var name=match.Groups[“name”].Value;
返回新的{kind,name};
});
var教师=新列表();
foreach(行中的var行)
{
如果(line.kind==“教师”)
Add(新教师{Name=line.Name});
else if(line.kind==“Class”)
teachers.Last().Classes.Add(新类{Name=line.Name});
其他的
teachers.Last().Classes.Last().Student.Add(新学生{Name=line.Name});
}

我认为您需要定义语法。考虑使用或其他解析器生成器。< BR/> 但是,您可以使用正则表达式和一些额外的C代码进行解析#

定义您的模型:

public class Teacher
{
    public string Name { get; set; }
    public List<Class> Classes { get; set; } = new List<Class>();
}

public class Class
{
    public string Name { get; set; }
    public List<Student> Students { get; set; } = new List<Student>();
}

public class Student
{
    public string Name { get; set; }
}
公共课堂教师
{
公共字符串名称{get;set;}
公共列表类{get;set;}=new List();
}
公共课
{
公共字符串名称{get;set;}
公共列表学生{get;set;}=new List();
}
公立班学生
{
公共字符串名称{get;set;}
}
然后分析您的输入:

var lineParser = new Regex("^(?<kind>Teacher|Class|)\\s*(?<name>[^$]+)");
var lines = input.Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
    .Select(line =>
    {
        var match = lineParser.Match(line);
        var kind = match.Groups["kind"].Value;
        var name = match.Groups["name"].Value;
        return new { kind, name };
    });

var teachers = new List<Teacher>();
foreach (var line in lines)
{
    if (line.kind == "Teacher")
        teachers.Add(new Teacher {Name = line.name});
    else if (line.kind == "Class")
        teachers.Last().Classes.Add(new Class {Name = line.name});
    else
        teachers.Last().Classes.Last().Students.Add(new Student {Name = line.name});
}
var lineParser=newregex(“^(?Teacher | Class |)\\s*(?[^$]+)”;
var lines=input.Split(“\r\n”.ToCharArray(),StringSplitOptions.RemoveEmptyEntries)
.选择(行=>
{
var match=lineParser.match(line);
var kind=match.Groups[“kind”].Value;
var name=match.Groups[“name”].Value;
返回新的{kind,name};
});
var教师=新列表();
foreach(行中的var行)
{
如果(line.kind==“教师”)
Add(新教师{Name=line.Name});
else if(line.kind==“Class”)
teachers.Last().Classes.Add(新类{Name=line.Name});
其他的
teachers.Last().Classes.Last().Student.Add(新学生{Name=line.Name});
}

您期望的输出是什么?您的列表是某种类别的列表吗?还是字符串列表?总体目标是什么?我想你可能走错了路。请忽略突出显示,它是纯文本。班级指的是普通的学校班级,而不是O.O.班。我编辑问题字段之间的分隔符是什么?从正则表达式中,它是一个
\t
,从示例中,它是一个
\r\n
。试试看。这将返回班级、教师和学生的简单列表。您期望的输出是什么?您的列表是某种班级的列表吗?还是字符串列表?总体目标是什么?我想你可能走错了路。请忽略突出显示,它是纯文本。班级指的是普通的学校班级,而不是O.O.班。我编辑问题字段之间的分隔符是什么?从正则表达式中,它是一个
\t
,从示例中,它是一个
\r\n
。试试看。这将返回班级、教师和学生的简单列表。