-5

この出力から簡単な方法で次の情報を変数に抽出する方法を教えてもらえますか?

出力:

AT+CMGL="ALL"
+CMGL: 0,"REC READ","+40728072005",,"12/06/29,13:04:26+12"
password,1,ON

上記の出力のいくつかの情報から、以下のように変数に抽出したいと思います。

msisdn="+40728072005"
passwd="password"
itemno="1"
command="ON"

-

    string split = ",";
    string[] substrings = Regex.Split(buff, split);
    foreach (string match in substrings)
    {
        Console.WriteLine("'{0}'", match);
    }

画像->[1]:http: //i.stack.imgur.com/zl6Nj.png

不要な出力を最初から除外する方法はありますか?grep -vのように、私はC#にあまり詳しくありません。

これまでのところ、私はこの点に到達しました:

    string split = ",";
    string split1 = "\"";
    string split2 = "OK";
    string[] substrings = Regex.Split(buff, split);
    string[] substrings1 = Regex.Split(substrings[2], split1);
    Console.WriteLine(substrings1[1]);
    string[] substrings2 = Regex.Split(substrings[5], split1);

    Console.WriteLine(substrings2[1]);
    Console.WriteLine(substrings[6]);
    string[] substrings3 = Regex.Split(substrings[7], split2);
    Console.WriteLine(substrings3[0]);

それでも、私はメッセージ形式を知っているので、これは文字列を分割することによって行われます。

4

2 に答える 2

2

カンマ区切りの値が固定されているように見えるため、位置によって特定の値の意味が定義されます。等号の前のすべてを削除してから、コンマで分割し、必要な値を個別に処理します。

于 2012-06-29T10:25:13.390 に答える
0

このデモを試して、コンソールアプリケーションのMainメソッドに配置します(Regexを使用するため、「using System.Text.RegularExpressions;」という行を追加する必要があります)。

        string input = "AT+CMGL=\"ALL\"\n+CMGL: 0,\"REC READ\",\"+40728072005\",,\"12/06/29,13:04:26+12\"\npassword,1,ON";
        var matches = Regex.Matches(
            input,
            @"\""(?<msisdn>\+\d*)\"",.*,\""(?<date>\d{2}\/\d{2}/\d{2},\d{2}:\d{2}:\d{2}\+\d{2})\"".*\n+(?<passwd>[^,]*),(?<itemno>\d*),(?<command>\w*)"
            , RegexOptions.Multiline);

        foreach (Match m in matches)
        {
            Console.WriteLine(m.Groups["msisdn"].Value);
            Console.WriteLine(m.Groups["date"].Value);
            Console.WriteLine(m.Groups["passwd"].Value);
            Console.WriteLine(m.Groups["itemno"].Value);
            Console.WriteLine(m.Groups["command"].Value);
        }
        Console.ReadKey();

基本的に、正規表現はテキスト内の定義されたパターンを検索します。式の意味:

\ ""-これが引用符の定義方法です。バックスラッシュでエスケープされ、2回書き込まれるため、コンパイラエラーは発生しません。

(?+ \ d *)-通常、括弧で囲まれた式は、グループをキャプチャすることを意味します。これは名前付きグループであり、名前は?で指定されます。このグループは、+記号で始まる文字列をキャプチャします(エスケープされます)。バックスラッシュで)、その後にバックスラッシュと文字「d」で表される数字が続きます(「d」は「数字」から来ます)。バックスラッシュは、特別な意味を持つ文字のエスケープ文字として使用されます。アスタリスク*は、その前に来る文字が0回以上出現する可能性があることを意味します。

\ ""-引用符、これは「msisdn」番号の終了引用符です。

、-はコンマを意味します。

。*-ドットは任意の文字を意味し、それに続くアスタリスクは、任意の文字が0回以上出現する可能性があることを意味します。

(?\ d {2} / \ d {2} / \ d {2}、\ d {2}:\ d {2}:\ d {2} + \ d {2})-日付を取得する名前付きグループ、式\ d{2}には数字を意味する\dと、数字の表示が2回発生することを正規表現エンジンに通知する{2}があり、次に/-スラッシュを意味します(バックスラッシュでエスケープされます)。その後、コロンで区切られた数字が続き、最後にプラス記号とその2桁が続きます。これにより、日付が抽出されます。

\ n +-\ nは改行を意味し、+は改行が1回以上出現することを意味する数量詞です。

(?[^、] *)-パスワード部分をキャプチャする名前付きグループです。[^、]はカンマ以外の文字をキャプチャする必要があることを意味し、角かっこは文字の範囲を意味し、^は否定を意味し、アスタリスクは文字が出現する可能性があることを意味します0以上の回数。

(?\ d *)-\d*で定義された数値を取得する名前付きグループです

(?\ w *)-単語の文字(文字、数字、アンダースコア)をキャプチャする名前付きグループです

于 2012-06-29T11:02:48.563 に答える