1

この VMG ファイルからメッセージ文字列を取得しようとしています。日付行の後、「END:VBODY」の前の文字列のみを指定したい

これまでに得た最高のものは、この正規表現文字列 BEGIN:VBODY([^\n]*\n+)+END:VBODY です

誰でもそれを改善するのを助けることができますか?

N:
TEL:+65123345
END:VCARD
BEGIN:VENV
BEGIN:VBODY
Date:8/11/2013 11:59:00 PM
thi is a test message
Hello this is a test message on line 2
END:VBODY
END:VENV
END:VENV
END:VMSG
4

2 に答える 2

1

正規表現を使用する場合は、現在の正規表現を少し変更できます。これは、$0 グループに探しているものが含まれているためです。

BEGIN:VBODY\n?((?:[^\n]*\n+)+?)END:VBODY

基本的に、起こったことは次のように([^\n]*\n+)+なりました(?:[^\n]*\n+)+?(この部分を怠惰にする方が安全かもしれません)

そして、その部分全体を括弧で囲みます:((?[^\n]*\n+)+?)

この前に追加\n?して、出力を少しきれいにしました。


正規表現以外のソリューションは、次のようなものです。

string str = @"N:
    TEL:+65123345
    END:VCARD
    BEGIN:VENV
    BEGIN:VBODY
    Date:8/11/2013 11:59:00 PM
    thi is a test message
    Hello this is a test message on line 2
    END:VBODY
    END:VENV
    END:VENV
    END:VMSG";

int startId = str.IndexOf("BEGIN:VBODY")+11; // 11 is the length of "BEGIN:VBODY"
int endId = str.IndexOf("END:VBODY");
string result = str.Substring(startId, endId-startId);
Console.WriteLine(result);

出力:

Date:8/11/2013 11:59:00 PM
thi is a test message
Hello this is a test message on line 2

イデオンデモ

于 2013-09-26T06:12:20.023 に答える
0

これは、正規表現を使用したソリューションです。

        string text = @"N:
        TEL:+65123345
        END:VCARD
        BEGIN:VENV
        BEGIN:VBODY
        Date:8/11/2013 11:59:00 PM
        thi is a test message
        Hello this is a test message on line 2
        END:VBODY
        END:VENV
        END:VENV
        END:VMSG";


string pattern = @"BEGIN:VBODY(?<Value>[a-zA-Z0-9\r\n.\S\s ]*)END:VBODY";//Pattern to match text.
Regex rgx = new Regex(pattern, RegexOptions.Multiline);//Initialize a new Regex class with the above pattern.
Match match = rgx.Match(text);//Capture any matches.
if (match.Success)//If a match is found.
{
        string value2 = match.Groups["Value"].Value;//Capture match value.
        MessageBox.Show(value2);
}

ここでデモ。

そして今、非正規表現ソリューション、

        string text = @"N:
        TEL:+65123345
        END:VCARD
        BEGIN:VENV
        BEGIN:VBODY
        Date:8/11/2013 11:59:00 PM
        thi is a test message
        Hello this is a test message on line 2
        END:VBODY
        END:VENV
        END:VENV
        END:VMSG";

        int startindex = text.IndexOf("BEGIN:VBODY") + ("BEGIN:VBODY").Length;//The just start index of Date...
        int length = text.IndexOf("END:VBODY") - startindex;//Length of text till END...
        if (startindex >= 0 && length >= 1)
        {
            string value = text.Substring(startindex, length);//This is the text you need.
            MessageBox.Show(value);
        }
        else
        {
            MessageBox.Show("No match found.");
        }

ここでデモ。

それが役に立てば幸い。

于 2013-09-26T06:38:56.387 に答える