我正在尝试使用正则表达式从C#中的字符串中获取段落。 按段落;我的意思是以双或更多\ r \ n结尾的字符串块。 (不是HTML段落< p>)...
以下是示例文字:
例如,这是一个带回车符的段落 这里有一条新线。
此时,第二段开始。如果匹配的是两个或更多\ r \ n,则段落结束;如果在字符串末尾($)到达,则段落结束。
我试过这个模式:
Regex regex = new Regex(@"(.*)(?:(\r\n){2,}|\r{2,}|\n{2,}|$)", RegexOptions.Multiline);
但这不起作用。它匹配以单个\ r \ n结尾的每一行。我需要的是获得所有字符,包括单个回车和换行字符,直到达到双\ r \ n。
答案 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' .