0

受信したメッセージを、シリアルポートを介してGSMモデムから読み取られるテキストファイルに追加します。後で、正規表現を使用してこれらのメッセージを解析し、リストビューに表示します。1行のメッセージを受信して​​表示することは問題ありませんが、複数行のメッセージを受信すると、それらを読み取ることができません。解析に使用する正規表現を変更する必要があると思います。提案をお願いします。

    public ShortMessageCollection ParseMessages(string input)
    {
        ShortMessageCollection messages = new ShortMessageCollection();
        Regex r = new Regex(@"\+CMGL: (\d+),""(.+)"",""(.+)"",(.*),""(.+)""\r\n(.+)\r\n");
        Match m = r.Match(input);
        while (m.Success)
            {
                ShortMessage msg = new ShortMessage();
                msg.Index = m.Groups[1].Value;
                msg.Status = m.Groups[2].Value;
                msg.Sender = m.Groups[3].Value;
                msg.Alphabet = m.Groups[4].Value;
                msg.Sent = m.Groups[5].Value;
                msg.Message = m.Groups[6].Value;
                messages.Add(msg);
                m = m.NextMatch();
            }

        return messages;
     }

inputファイルから読み取られたデータを含む文字列変数です。の1行のメッセージinputは次のようになります。

+CMGL: 1,\"REC UNREAD\",\"IA-612345\",\"\",\"2012/08/14 12:56:46+22\"\r\nRecharge with RC45 & get 100 local minutes valid for 15days.For details call 53640 (Toll Free)\r\n\r\n

複数行のメッセージは次のようになります。

+CMGL: 1,\"REC READ\",\"+919909965834\",\"\",\"2012/08/17 09:55:29+22\"\r\nHai helo\nthis is a\ntest mesg\r\n\r\nOK\r\n

複数行メッセージのメッセージ部分を正しく完全に読み取るにはどうすればよいですか?

4

3 に答える 3

0

.NetRegexを複数行のテキストと照合する場合RegexOptions.Multilineは、コンストラクターパラメーターとして次のように指定する必要があります。

public ShortMessageCollection ParseMessages(string input)
{
    ShortMessageCollection messages = new ShortMessageCollection();
    Regex r = new Regex(
        @"\+CMGL: (\d+),""(.+)"",""(.+)"",(.*),""(.+)""\r\n(.+)\r\n",
        RegexOptions.Multiline);
    Match m = r.Match(input);
    while (m.Success)
    {
        ShortMessage msg = new ShortMessage();
        msg.Index = m.Groups[1].Value;
        msg.Status = m.Groups[2].Value;
        msg.Sender = m.Groups[3].Value;
        msg.Alphabet = m.Groups[4].Value;
        msg.Sent = m.Groups[5].Value;
        msg.Message = m.Groups[6].Value;
        messages.Add(msg);
        m = m.NextMatch();
    }

    return messages;
}
于 2012-08-17T05:24:21.980 に答える
0

正規表現を使用して問題全体を解決しようとしないことを検討するかもしれません。データの少なくとも一部が構造化されているように見えるので、そのために正規表現を使用できます。メッセージの実際の本文については、行がなくなるまで行を読み取るだけで済みます。ヘッダーを再度一致させることができます。

次のようなものを試してください:

var r = new Regex(@"\+CMGL: (\d+),""(.+)"",""(.+)"",(.*),""(.+)""",
                  RegexOptions.Compiled);
var messages = new ShortMessageCollection();
using (var sw = new StringReader(input))
{
    string currentLine = sw.ReadLine();
    while (currentLine != null)
    {
        var m = r.Match(currentLine);
        if (m.Success)
        {
            // read the first line of the message
            string message = string.Empty;
            currentLine = sw.ReadLine();

            // Append any extra lines to our message, unless it's a new record
            while (currentLine != null && !r.IsMatch(currentLine))
            {
                message += Environment.NewLine;
                message += currentLine;

                currentLine = sw.ReadLine();
            }

            messages.Add(new ShortMessage
                             {
                                 Index = m.Groups[1].Value,
                                 Status = m.Groups[2].Value,
                                 Sender = m.Groups[3].Value,
                                 Alphabet = m.Groups[4].Value,
                                 Sent = m.Groups[5].Value,
                                 Message = message,
                             });
        }
        else
        {
            // TODO: Log that a line didn't match
            // it could be empty or otherwise invalid
            currentLine = sw.ReadLine();
        }
    }
}

これは、できることの大まかな概要です。非常に大量のデータを処理する場合は、単一の正規表現に対してこのようなアプローチ (必ずしもこのコードである必要はありません) を使用することを強くお勧めします。これは TextReader を使用するため、数 GB のサイズのファイルから 1 行ずつ読み取る場合は、すぐに機能します。

于 2012-08-17T07:29:54.403 に答える
0

この正規表現を使用してみてください。最後のグループに一致する文字として \r と \n が含まれます。これに関する 1 つの問題は、\n および \r 文字が除外されることです。それらもキャプチャしたい場合は?:、式から を削除して、そのキャプチャも機能させることができます。

"\+CMGL: (\d+),""(.+)"",""(.+)"",(.*),""(.+)""\r\n([^\r]+)\r\n"
于 2012-08-17T05:53:55.210 に答える