Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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中的一段#_C#_.net_Regex - Fatal编程技术网

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

C# 正则表达式C中的一段#,c#,.net,regex,C#,.net,Regex,我试图创建一个正则表达式,将标题与段落相匹配,然后将段落中的所有文本与文本文件相匹配。此段落可以出现在文本文件的不同部分,但设置如下: 收入确认 \n(空行) 关于收入确认的变长段落 \n(空行) 我想知道标题,然后是段落。有没有办法写一个以空行结尾的正则表达式 到目前为止,我得到的是: Regex regRev_Rec = new Regex(@"Revenue Recognition(?s).*\n\n(?s).*"); string[] lines = File.ReadAllLines(

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

收入确认

\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);
      }
}
但这似乎并不正确

非常感谢您的帮助

\A.*
在这里找到它:

\A表示匹配必须从字符串的开头开始。 (.)通配符表示除换行符(\n)以外的任何字符。 星号表示您找到的前面的所有字符,表示(.)通配符

您也可以使用:^*


是Regex帮助的链接。

好吧,我建议您尝试以下代码片段

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)
{

}

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

(?s)(?:^|\n)Revenue Recognition(?:\r?\n){2,}(?<par>.*?)(?:(?:\r?\n){2,}|$)
您的解决方案不起作用,因为您逐行读取文件,然后检查每一行,因此无法将多行块与正则表达式匹配。当您将文件读到底时,可以使用
RegexOptions.Singleline
(或内联版本
(?s)
)来匹配整个多行块。使用这种方法,文件不应该很长

正则表达式细分:

  • (?s)
    -启用单线模式
  • (?:^ |\n)
    -字符串的开头或换行符
  • 收入确认
    -匹配字符的文字顺序
  • (?:\r?\n){2,}
    -2个或更多换行符
  • (?*?)
    -包含段落的组(0+任何字符,尽可能少到…)
  • (?:\r?\n){2,}
    -2换行符

不过,捕获已知字符序列不是一个好主意。这是不必要的开销。是的,你是对的。练习的目的是给OP一些想法,帮助他们实现他们想要的东西。好吧,恐怕OP用这种模式不会实现任何目标。这段文字可以出现在文本文件的不同部分,是这里的关键。从纯代码答案的定义来看,纯代码答案没有帮助。是的,我明白你的意思。我已经更新了正则表达式,现在它不依赖于硬编码序列,并且将匹配文件中任何位置的标题|段落序列。您的“text”变量的值是多少?此外,我只是在寻找收入确认一段。我不需要得到每一段。请添加一个解释,说明这意味着什么以及它如何回答问题。嗨,我知道这是我最初问了好几个星期后,但你的解决方案已经奏效了!然而,我意识到“收入确认”标题下可能有多个段落,所以我现在要做的是找到“收入确认”,然后抓住接下来的50行,不管它是否与收入确认有关。我想知道如何修改正则表达式以匹配“收入确认”,然后再修改接下来的50行,不管它是空的、有字符还是有数字。有什么建议吗?谢谢您可以使用
@(?m-s)^收入确认。*(?:\r\n.*){0,50}“
(?s)(?:^|\n)Revenue Recognition(?:\r?\n){2,}(?<par>.*?)(?:(?:\r?\n){2,}|$)
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);
}