要求:   字符串  !AIVDM,1,1,,B,B69DlVP0HJ<8=`4F`:H!AIVDM,1,1,,A,19NS>F002w8iJ8pAN1bTt3pF087B,0*59
用正则表达式找出开头为 "!"  结尾倒数第3个字符为"*" 并且最后两位是一16进制数
现正则表达式为: (\$|!).*?\*[0-9a-fA-F]{2}
现在出现了问题,,如上面给出的字符串 是符合了该正则表达式,在该字符串中 
!AIVDM,1,1,,A,19NS>F002w8iJ8pAN1bTt3pF087B,0*59  其实也是符合要求的,但是却不能将它分析出来请问如何改正一下正则表达式,  让它可以将这两个都能同时找出来.

解决方案 »

  1.   

    上面的写错了用正则表达式找出开头为 "!" 结尾倒数第3个字符为"*" 并且最后两位是一16进制数
    ![^!]*\*[0-9a-fA-F]{2} 这样应该可以
    但是 !AIVDM,1,1,,B,B69DlVP0HJ<8=`4F`:H 这个也要匹配出来吗?
      

  2.   

     !AIVDM,1,1,,B,B69DlVP0HJ<8=`4F`:H!AIVDM,1,1,,A,19NS>F002w8iJ8pAN1bTt3pF087B,0*59
    这整个字符是一个,但是在这个字符串中还包含一个符合标准的, 
    !AIVDM,1,1,,A,19NS>F002w8iJ8pAN1bTt3pF087B,0*59
    也应该分析出来才对.. 
      

  3.   

    那如果在加一点
    !AIVDM,1,1,,B,B69DlVP0HJ<8=`4F`:H!AIVDM,1,1,,A,19NS>F002w8iJ8pAN1bTt3pF087B,0*59!dsddsasdasd*67这样是不是要有
    !AIVDM,1,1,,B,B69DlVP0HJ<8=`4F`:H!AIVDM,1,1,,A,19NS>F002w8iJ8pAN1bTt3pF087B,0*59!AIVDM,1,1,,A,19NS>F002w8iJ8pAN1bTt3pF087B,0*59!dsddsasdasd*67!AIVDM,1,1,,A,19NS>F002w8iJ8pAN1bTt3pF087B,0*59!dsddsasdasd*67!AIVDM,1,1,,B,B69DlVP0HJ<8=`4F`:H!AIVDM,1,1,,A,19NS>F002w8iJ8pAN1bTt3pF087B,0*59!dsddsasdasd*67这5种匹配?
      

  4.   

    可以算是环视的一个典型应用了string test = "!AIVDM,1,1,,B,B69DlVP0HJ<8=`4F`:H!AIVDM,1,1,,A,19NS>F002w8iJ8pAN1bTt3pF087B,0*59";
    Regex reg = new Regex(@"(?is)(?=(!.*?\*[0-9a-f]{2}))");
    MatchCollection mc = reg.Matches(test);
    foreach (Match m in mc)
    {
        richTextBox2.Text += m.Groups[1].Value + "\n";
    }
    /*-------输出---------
    !AIVDM,1,1,,B,B69DlVP0HJ<8=`4F`:H!AIVDM,1,1,,A,19NS>F002w8iJ8pAN1bTt3pF087B,0*59
    !AIVDM,1,1,,A,19NS>F002w8iJ8pAN1bTt3pF087B,0*59
    */