我怎样才能提取“”之间的信息? C#

时间:2012-06-29 10:20:32

标签: c# serial-port buffer

任何人都可以告诉我如何从输出中以简单的方式将以下信息提取到变量。

输出:

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]);

仍然,这是通过拆分字符串来完成的,因为我知道消息格式。

2 个答案:

答案 0 :(得分:2)

看起来你有一个固定数量的逗号分隔值,所以这个位置定义了特定值的含义。我会在等号之前删除所有内容,然后用逗号分隔并分别处理所需的值。

答案 1 :(得分:0)

试试这个演示,把它放在一个控制台应用程序的Main方法中(它使用正则表达式,所以你必须使用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();

基本上,正则表达式在文本中搜索已定义的模式。 表达的含义:

\“” - 这就是如何定义引号,它是用反斜杠转义并写入两次,因此不会导致编译错误。

(?+ \ d *) - 通常,括号表达意味着您正在捕获一个组,这里是一个命名组,它的名称由?指定,该组将捕获以+符号开头的字符串(它由反斜杠转义)后跟数字,用反斜杠和字母“d”表示(“d”来自“数字”)。反斜杠用作具有特殊含义的字符的转义字符。星号*表示前面的字符可以出现0次或更多次。

\“” - 引用,这是“msisdn”号的结束语。

, - 表示逗号。

。* - dot表示任何字符,其后面的星号表示任何字符都可以出现0次或更多次。

(?\ d {2} / \ d {2} / \ d {2},\ d {2}:\ d {2}:\ d {2} + \ d {2}) - 命名组捕获日期,表达式\ d {2}有\ d表示数字和{2}告诉正则表达式引擎数字shoud出现两次,然后来/ - 它表示forwardslash(它通过反斜杠转义)。之后是以冒号分隔的数字,最后是加号和后两位数,这就是日期的提取方式。

\ n + - \ n表示换行符,+是一个量词,表示换行符出现一次或多次。

(?[^,] *) - 是一个捕获密码部分的命名组,[^,]表示应捕获除逗号以外的任何字符,方括号表示字符范围,^表示否定,星号表示字符可以发生0次或更多次。

(?\ d *) - 是一个命名组,用于捕获\ d *

定义的数字

(?\ w *) - 是一个捕获单词字符(字母,数字和下划线)的命名组