2

正規表現を使用して C# の文字列から段落を取得しようとしています。段落ごと。2 つ以上の \r\n で終わる文字列ブロックを意味します。(HTML 段落 <p> ではありません)...

サンプルテキストは次のとおりです。

たとえば、これはキャリッジ リターンがここ
に、改行がここにある段落です。

この時点で、2 番目の段落が開始されます。2 倍以上の \r\n が一致した場合、または
文字列 ($) の末尾に達した場合、段落は終了します。

私はパターンを試しました:

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

しかし、これは機能しません。単一の \r\n で終わるすべての行に一致します。私が必要とするのは、二重の\r\nに達するまで、単一のキャリッジリターンと改行文字を含むすべての文字を取得することです.

4

3 に答える 3

3

.*貪欲で、できる限り消費しています。の 2 番目のセットに()は がある$ため、使用されている式は です(.*)(?).*を欲張らないようにするには、 を続けます?

RegexOptions.Multiline を指定すると、.NET は入力を改行で分割します。RegexOptions.Singleline を使用して、入力全体を 1 つとして扱うようにします。

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 に答える