2

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

这是一个示例文本:

例如,这是一个段落,此处有回车,此处
有新行。

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

我尝试了这种模式:

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

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

4

3 回答 3

3

.*尽可能地贪婪和消耗。你的第二组()有一个$所以正在使用的表达式是(.*)(?)。为了使.*不贪心,请在后面加上?.

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

Regex regex = new Regex(@"(.*?)(?:(\r\n){2,}|\r{2,}|\n{2,}|$)", RegexOptions.Singleline);
于 2010-09-01T03:13:28.533 回答
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);
于 2010-09-01T10:17:33.510 回答
0

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

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

YourParaProcessor 
=
 {Paragraph}
.

Paragraph =
  {paraLetter} '\r\n' .
于 2010-09-01T03:22:12.073 回答