正则表达式C#中的一个段落

时间:2016-03-07 23:49:58

标签: c# .net regex

我正在尝试创建一个正则表达式,该表达式将标题与段落匹配,然后创建段落中文本文件中的所有文本。此段落可以出现在文本文件的不同部分,但设置如下:

收入确认

\ n(空行)

有关收入确认的不同长度的段落

\ n(空行)

我正在尝试获得标题,然后是段落。有没有办法写一个正则表达式以空白行结束?

到目前为止我所拥有的是:

Regex regRev_Rec = new Regex(@"Revenue Recognition(?s).*\n\n(?s).*");
string[] lines = File.ReadAllLines(fileName);
foreach (string line in lines)
{
    foreach (Match recrev in regRev_Rec.Matches(line))
      {
           outputFile.WriteLine(recrev);
      }
}

但这似乎并不接近正确。

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:3)

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

(?s)(?:^|\n)Revenue Recognition(?:\r?\n){2,}(?<par>.*?)(?:(?:\r?\n){2,}|$)

请参阅regex demo

enter image description here

该段落位于recrev.Groups["par"].Value,以下是一些示例代码(我添加了outfile变量):

string file_contents = string.Empty;
using (StreamWriter outputFile = new StreamWriter(outfile, false, Encoding.UTF8)) 
{
    using (StreamReader sr = new StreamReader(fileName))
    {
        file_contents = sr.ReadToEnd();
    }
    foreach (Match recrev in Regex.Matches(file_contents, @"(?s)(?:^|\n)Revenue Recognition(?:\r?\n){2,}(?<par>.*?)(?:(?:\r?\n){2,}|$)"))
        outputFile.WriteLine(recrev);
}

您的解决方案不起作用,因为您按行读取文件,然后检查每一行,因此,您没有办法将多行块与正则表达式匹配。当您将文件读到最后时,可以使用RegexOptions.Singleline(或内联版本(?s))来匹配整个多行块。使用这种方法,文件不应该很长。

正则表达式分解:

  • (?s) - 启用单线模式
  • (?:^|\n) - 字符串的开头或换行符
  • Revenue Recognition - 匹配字符的字符序列
  • (?:\r?\n){2,} - 2个或更多次换行
  • (?<par>.*?) - 持有段落的组(0+任意字符,尽可能少到......)
  • (?:\r?\n){2,} - 2次换行。

答案 1 :(得分:1)

好吧,我建议您尝试使用以下代码段。

try
{
    var text = File.ReadAllText(fileName);

    var regexObj = new Regex("(?<title>Revenue Recognition)(?:(?:\r?\n){2})(?<paragraph>^.*?(?:(?:\r?\n){2}))",
        RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.Multiline);

    var match = regexObj.Match(text);
    if (match.Success)
    {
        var title = match.Groups["title"].Value;
        var paragraph = match.Groups["paragraph"].Value;

        Console.WriteLine("Title:\n" + title);
        Console.WriteLine();
        Console.WriteLine();
        Console.WriteLine("Paragraph:\n" + paragraph.Trim());
    }
}
catch (ArgumentException ex)
{

}

会打印

Title:
Revenue Recognition


Paragraph:
Paragraph of varying length about revenue recognition

答案 2 :(得分:0)

\A.*

在此处找到:link

\ A表示匹配必须从字符串的开头开始。 (。)通配符表示除换行符(\ n)之外的任何字符。 星号表示前面提到的许多内容,指的是(。)通配符。

你也可以使用:^。*

Here是Regex帮助的链接。