我正在尝试创建一个正则表达式,该表达式将标题与段落匹配,然后创建段落中文本文件中的所有文本。此段落可以出现在文本文件的不同部分,但设置如下:
收入确认
\ 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);
}
}
但这似乎并不接近正确。
非常感谢任何帮助!
答案 0 :(得分:3)
您可以使用以下正则表达式:
(?s)(?:^|\n)Revenue Recognition(?:\r?\n){2,}(?<par>.*?)(?:(?:\r?\n){2,}|$)
请参阅regex demo
该段落位于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)