1

取得できないようです...繰り返しパターンを抽出する必要のあるテキストの文字列がありますが、その一部しか取得できないか、文字列全体の単一の一致を取得しています...

文字列は「マーカー」と「コンテンツ」を連結したものであり、各マーカーとそのコンテンツを抽出する必要があります。

string s = "T:     2  YE             I:      4  YE";
Match m = Regex.Match(s, "(?'marker'(T|I)):(?'content'.+)");
while (m.Success)
{
    string Marker = m.Groups["marker"].value; // (T: or I:)
    string Content = m.Groups["content"].value; // (2 YE or 4 YE)
    m = m.NextMatch();
}

「。+」と「。+?」の両方を試しました 最大/最小キャプチャの場合ですが、マーカーはあるがコンテンツがない2つの一致、またはWHOLE入力文字列との1つの一致があります。

ポインタをお願いします:)

4

2 に答える 2

1
(?'marker'(T|I)):(?'content'.+)

行の残り全体を消費するため、機能しません.+(貪欲に一致し、行の残りを消費することを妨げるものは何もありません)。

(?'marker'(T|I)):(?'content'.+?)

.+?しぶしぶ一致するため、1文字だけを消費してから停止します。

「コンテンツ」がいつ終了するかを指定できる必要があります。私はあなたがこれを行う正しい方法を知っていることを確認するのに十分なほどあなたが提供したフォーマットを本当に理解していませんが、任意の数の大文字とそれに続くコロン( "T:"、 "ST:"など)を想定しています。または"ORANGUTANS:")マーカーとしての資格があり、これは機能するはずです:

([A-Z]+:)(((?![A-Z]+:).)+)

これは、ネガティブ先読みを使用して、次のマーカーがどこから始まるかを認識します。1番目と2番目のキャプチャグループは、それぞれマーカーとコンテンツをキャプチャする必要があります。

キャプチャグループに名前を付けるために使用する構文についてはあまり詳しくありませんが、これでうまくいくと思います。

(?'marker'[A-Z]+:)(?'content'((?![A-Z]+:).)+)
于 2013-03-20T17:08:01.490 に答える
0

これを試して:

Regex("(T:|I:)").Split(s);
于 2013-03-20T19:48:48.203 に答える