.NET正则表达式:获取段落

时间:2010-09-01 03:03:00

标签: c# regex paragraphs

我正在尝试使用正则表达式从C#中的字符串中获取段落。 按段落;我的意思是以双或更多\ r \ n结尾的字符串块。 (不是HTML段落< p>)...

以下是示例文字:

  

例如,这是一个带回车符的段落   这里有一条新线。

此时,第二段开始。如果匹配的是两个或更多\ r \ n,则段落结束;如果在字符串末尾($)到达,则段落结束。

我试过这个模式:

Regex regex = new Regex(@"(.*)(?:(\r\n){2,}|\r{2,}|\n{2,}|$)", RegexOptions.Multiline);

但这不起作用。它匹配以单个\ r \ n结尾的每一行。我需要的是获得所有字符,包括单个回车和换行字符,直到达到双\ r \ n。

3 个答案:

答案 0 :(得分:3)

.*正在贪婪和消费尽可能多。您的第二组()$,因此正在使用的表达式为(.*)(?)。为了使.*不贪婪,请使用?进行操作。

当您指定RegexOptions.Multiline时,.NET将在换行符上拆分输入。使用RegexOptions.Singleline使其将整个输入视为一个。

Regex regex = new Regex(@"(.*?)(?:(\r\n){2,}|\r{2,}|\n{2,}|$)", RegexOptions.Singleline);

答案 1 :(得分:2)

相反的方法是匹配分隔符而不是段落,使问题几乎无关紧要。考虑:

string[] paragraphs = Regex.Split(text, @"^\s*$", RegexOptions.Multiline);

通过空行拆分输入字符串,您可以轻松获取所有段落。如果您只想要没有空格的空行,则可以进一步简化,并使用parretn ^$。在这种情况下,您还可以使用非正则表达式String.Split,以及一个分隔符数组:

string[] separators = {"\n\n", "\r\r", "\r\n\r\n"};
string[] paragraphs = text.Split(separators,
                                 StringSplitOptions.RemoveEmptyEntries);

答案 2 :(得分:0)

你必须使用正则表达式吗?像COCO/R这样的工具也可以让这项工作变得非常简单。此外,它可能比使用正则表达式在运行时生成代码更快。

COMPILER YourParaProcessor
// your code goes here
TOKENS
newLine= '\r'|'\n'.
paraLetter = ANY - '\n' - '\r' .

YourParaProcessor 
=
 {Paragraph}
.

Paragraph =
  {paraLetter} '\r\n' .