【问题标题】:Regex for multiline header c#多行标题c#的正则表达式
【发布时间】:2016-09-01 04:59:04
【问题描述】:

我是一名新的 C# 程序员。我正在尝试制作一个简单的 c# 应用程序,如果它们是这种格式,它将从 pdf 文件(书)中提取标题:

1.1 电气/电子行业

1.2 简史

1.3 计量单位

我正在使用代码:

string pattern = @"(\d+)(\.)(\d+) ([A-Z]+).([A-Z]+).([A-Z]+).([A-Z]+).([A-Z]+)";
Regex.match(strText,pattern); 

适用于单行标题,但不适用于两行/多行标题。 有人可以帮忙吗?

【问题讨论】:

  • 你说的是目录还是什么?如果您将本书的整个文本视为单个字符串并运行一次正则表达式,您将永远无法使用正则表达式。你会发现很多误报,也可能会漏掉一些。
  • 那个正则表达式没有做你认为它正在做的事情。例如,它将匹配行XYZ1.2 A BRIEF HISTORY,而不匹配行2.4 SUMMARY。我建议你找到一些关于正则表达式的教程(但不要在这里要求一个,因为这显然是题外话)。
  • 是的,我说的是本书的全文。我选择它是因为它的格式很好。似乎有效,但是有一些我认为可以解决的小问题,@SledgeHammer
  • 是的,我是 C# 新手。我觉得我应该多学习。谢谢 :) @AdrianHHH

标签: c# regex multiline


【解决方案1】:

我不熟悉 C# 风格的正则表达式,但 . 不是任何字符匹配(换行除外)吗?

如果您需要新的行,那么您还必须在末尾包含一个实际的\n ,除非您还打算有替代方案,否则可能还要加上一个?

但我有点惊讶这个正则表达式没有引起任何问题,除非书的格式恰好是完美的。

【讨论】:

    【解决方案2】:

    假设您已经在单个字符串中获得了所需的目录,唯一的问题是解析二级标题。

    修改正则表达式以仅匹配大写字母。

    您可以使用以下代码实现所需的结果:

        string pattern = @"((\d+\.\d+) ([A-Z\s]+)\n)+";
        var match = Regex.Match(input, pattern);
    
        var headers = new List<string>();
        for (var i = 0; i < match.Groups[1].Captures.Count; i++)
        {
            headers.Add(match.Groups[1].Captures[i].Value);
        }
    

    在它之后headers 将包含所有必需的数据。

    假设input 包含输入数据。另外,请注意\n 是换行符。

    您的正则表达式已简化。

    (\d+\.\d+) 代表“一个或多个数字字符”、点、“一个或多个数字字符”、空格的序列。

    ([A-Z\s]+)\n - "一个或多个大写字母或空格", "换行符"

    另外,请阅读以下article 以熟悉 C# 正则表达式。

    【讨论】:

    • 您好,感谢您的链接和解决方案。您的解决方案同时捕获大写和小写字母字符串。有没有办法只捕捉大写字母?
    • @rabinmallick 我在答案中修改了正则表达式,只匹配大写字母和空格
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多