2010-09-01 93 views
1

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

这里是一个示例文本:

例如,这是一个回车这里
这里一个新行一个段落。

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

我试过模式:

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

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

+4

仅供参考,C#没有正则表达式支持。正则表达式的支持都在.NET中。 – 2010-09-01 03:09:15

回答

2

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

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

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

非常感谢。 (。+?)(?:(\ r \ n){2,} | \ r {2,} | \ n {2,} | $)作品... – 2010-09-01 03:20:24

0

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

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

YourParaProcessor 
= 
{Paragraph} 
. 

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

有趣的,简单的方法? – 2011-08-31 13:30:58

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); 
+0

您的方法似乎也可以工作,但是当您需要为所有匹配插入前缀时,rchern的方法运行得更快。谢谢。 – 2010-09-01 13:00:19