0

解析しようとしているデータのテスト サンプルを次に示します。

Content1
***
Content2
***
Content3
Content3
***

Content4
***
Content5

***
***
Content6
***
***
***
Content7

つまり、区切り文字列で区切られた新しい行のデータ エントリです。Content1、Content2、Content3\r\nContent3、\r\nContent4、Content5\r\n、Content6、Content7 を取得したい。非常に単純な regex を試し(\r\n)?^\*\*\*$(\r\n)?ました。RegexBuddy の Split で「^$ 改行で一致」オプションを選択し、.Net フレーバーを選択すると、正しい出力が得られます。ただし、次の C# コード:

string regexPattern = string.Format(@"(\r\n)?^{0}$(\r\n)?", Regex.Escape("***"));
var records = Regex.Split(document, regexPattern, RegexOptions.Multiline);

入力文字列全体を返します。ここでどこが間違っていますか?

また、正規表現(\r\n)?\*\*\*(\r\n)?(エントリに区切り文字列を含めることができるため、私にはあまり適していません) が Content1、\r\n、\r\n、Content2、\r\n などを返す理由がわかりません。 . \r\n アイテムを貪欲につかむべきではありませんか? RegexBuddy は、この正規表現で正しい出力を提供します。

4

1 に答える 1

1

1.正確にはどこが$一致しますか?

主な問題は、文字の$直前に一致することです。したがって、前がある場合は、パターンで指定する必要があります。それ以外の場合、一致は返されません。文字列をon で分割して効果を確認できます。\n\r\n"\r$""Content1\r\nContent2\r\nContent3"

行頭^と行末$(Multilineオプションの下) がどこにあると見なされるかを示す単なる例です。1 行目は元の文字列 (改行と改行はそれぞれ\nと で示されます) で、2 行目はと\rで一致する長さ 0 の文字列の位置で注釈が付けられます。^$

***\r\nConte\rn\rt3\r\nCo\nntent3
^***\r$\n^Conte\rn\rt3\r$\n^Co$\n^ntent3$

この問題を解決するには、直前に (オプション) をテストする必要があり\rます$。以下のセクション 3 のソリューションでは、入力ファイルが UNIX 環境からのものである場合は存在しない可能性がある\rため、optional をテストします。\r

2. 次の結果にキャプチャされたテキストを含めるRegex.Split:

.NET Framework 2.0 以降でRegex.Splitは、区切り文字で文字列が分割され、キャプチャされたテキストも結果配列に含まれます

上記の問題を解決するには、キャプチャ グループ(キャプチャ テキスト + グループ化プロパティ) を非キャプチャ グループ (?:pattern)(グループ化プロパティのみ) に変更する必要があります。

3. 結論

したがって、解決策は次のとおりです。

var records = Regex.Split(document, @"(?:\r?\n)?^[*]{3}\r?$\n?", RegexOptions.Multiline);

ideone のデモ

結果の空の文字列は個別に処理できます。

于 2013-04-05T13:27:21.190 に答える