C# 用正则表达式识别标题

C# 用正则表达式识别标题,c#,regex,parsing,pdf,C#,Regex,Parsing,Pdf,我想知道,假设文档之间的样式有时重叠,如何使用一个或多个正则表达式识别具有不同数字标记样式的标题。目标是提取每个文件中特定标题的所有副标题和数据,但这些文件没有标准化。正则表达式在这里是正确的方法吗 我正在开发一个程序,该程序解析.pdf文件并查找特定部分。一旦找到该节,它就会找到该节的所有子节及其内容,并将其存储在词典中。我首先将整个pdf读入字符串,然后使用此函数定位“标记”部分 一旦找到标记部分,我就使用它来查找小节 private Dictionary<string, string

我想知道,假设文档之间的样式有时重叠,如何使用一个或多个正则表达式识别具有不同数字标记样式的标题。目标是提取每个文件中特定标题的所有副标题和数据,但这些文件没有标准化。正则表达式在这里是正确的方法吗

我正在开发一个程序,该程序解析.pdf文件并查找特定部分。一旦找到该节,它就会找到该节的所有子节及其内容,并将其存储在
词典中。我首先将整个pdf读入字符串,然后使用此函数定位“标记”部分

一旦找到标记部分,我就使用它来查找小节

private Dictionary<string, string> GetSubsections(string text)
    {
      Dictionary<string, string> subsections = new Dictionary<string, string>();
      string[] unprocessedSubSecs = Regex.Split(text, SUBSECTIONREGEX);
      string title = "";
      string content = "";
      foreach(string s in unprocessedSubSecs)
      {
        if(s != "") //sometimes it pulls in empty strings
        {
          Match m = Regex.Match(s, SUBSECTIONREGEX);
          if (m.Success)
          {
            title = s;
          }
          else
          {
            content = s;
            if (!String.IsNullOrWhiteSpace(content) && !String.IsNullOrWhiteSpace(title))
            {
              subsections.Add(title, content);
            }
          }
        }
      }
      return subsections;
    }
以下是一些示例PDF文件:
看看这种方法是否有效:

var heading1Regex = @"^(\d+)\s(?<title>.*?)$\n(?<content>.*?)$\n*(?=^\d+\s|\Z)";
1。边缘情况1:5.2之后是7.1.3

如图所示, 使用heading2Regex获得主节匹配

将匹配的group1转换为整数

int.TryParse(match.group1, out var headingIndex);
获取heading3Regex的子节匹配

对于每个子部分匹配,将group1转换为整数

int.TryParse(match.group1, out var subHeadingIndex);

检查标题索引是否等于副标题索引。如果没有相应处理。

请查看此方法是否有效:

var heading1Regex = @"^(\d+)\s(?<title>.*?)$\n(?<content>.*?)$\n*(?=^\d+\s|\Z)";
1。边缘情况1:5.2之后是7.1.3

如图所示, 使用heading2Regex获得主节匹配

将匹配的group1转换为整数

int.TryParse(match.group1, out var headingIndex);
获取heading3Regex的子节匹配

对于每个子部分匹配,将group1转换为整数

int.TryParse(match.group1, out var subHeadingIndex);

检查标题索引是否等于副标题索引。如果不作相应处理。

恐怕你方配制的样品帮不了什么忙。我看你的问题没有解决的办法。这就是我担心的。是的,不幸的是,我不能共享文档,但它们没有明显的模式,所以用这种方式识别节是非常困难的。看看你的正则表达式,它们可以简化为删除“?”,在工作方式上没有区别,因为已经存在包含空格的相邻字符类。包含
\r?
也是一个问题,因为
\r
将是等效的,可能会被
$
淘汰。至于您的实际问题,
我的替代方案是编写一个主密钥。。。然后查找5.1.X+1以找到该部分的结尾。。。[然而],大多数都是从5.2->7.1.5开始的。。。。。。这里最好的潜在策略似乎是最初使用正则表达式查找节,然后将这些节之间的文本存储为节的文本。在创建包含小节的词典时,只需要一个函数来检查连续小节的编号,看看它们是否是小节,并进行相应的处理。在这种情况下,章节文本和小节层次结构构建(或其他)显然无法同时完成。我担心,您的虚构示例没有多大帮助。我看你的问题没有解决的办法。这就是我担心的。是的,不幸的是,我不能共享文档,但它们没有明显的模式,所以用这种方式识别节是非常困难的。看看你的正则表达式,它们可以简化为删除“?”,在工作方式上没有区别,因为已经存在包含空格的相邻字符类。包含
\r?
也是一个问题,因为
\r
将是等效的,可能会被
$
淘汰。至于您的实际问题,
我的替代方案是编写一个主密钥。。。然后查找5.1.X+1以找到该部分的结尾。。。[然而],大多数都是从5.2->7.1.5开始的。。。。。。这里最好的潜在策略似乎是最初使用正则表达式查找节,然后将这些节之间的文本存储为节的文本。在创建包含小节的词典时,只需要一个函数来检查连续小节的编号,看看它们是否是小节,并进行相应的处理。在这种情况下,章节文本和小节层次结构构建(或其他)显然不能同时完成。我离此更近了一步,我认为这种方法会起作用,但我需要调整正则表达式以匹配所有用例。谢谢我会告诉你我发现了什么。好消息是它正在工作。坏消息是,它正在吸引大量虚假的比赛。“我想我还要和正则表达式搏斗一段时间。@emsimpson92,如果你能提供虚假匹配的样本,我也可以试试。缩小范围不应该是什么大问题。我事先设计的模式是为了严格识别这类东西。我离这更近了一步,我认为这种方法会起作用,但我需要调整正则表达式以匹配所有用例。谢谢我会告诉你我发现了什么。好消息是它正在工作。坏消息是,它正在吸引大量虚假的比赛。“我想我还要和正则表达式搏斗一段时间。@emsimpson92,如果你能提供虚假匹配的样本,我也可以试试。缩小范围不应该是什么大问题。我事先设计的图案是为了严格识别这类东西。
int.TryParse(match.group1, out var headingIndex);
int.TryParse(match.group1, out var subHeadingIndex);