220 Welcome to TAP gateway for 263
ehlo ""
250-XFORWARD NAME ADDR PROTO HELO SOURCE
250-263.net
250-SIZE 47185920
250-ETRN
250-AUTH PLAIN LOGIN CRAM-MD5
250-AUTH=PLAIN LOGIN CRAM-MD5
250 8BITMIME以上是我登录SMTP服务器后,使用ehlo指令后返回的内容,我希望用一个正则表达式取出这样的值:
我想取出从“250-AUTH”或者“250 AUTH”开头的行字符串里的所有登录类型我自己使用的是:“250[-|\x20]AUTH[=|\x20](?<ValiTypes>(\w|\x20|-)+).+”这个来取的,但是取出来后,后期处理比较多(又是split的,又是trim的)。感觉麻烦,同事也觉得自己对正则的理解太差,所以来这里求个更强大的正则用一下。希望同志们多多帮忙要求提供的正则达到如下要求:
如果是上面的返回字符串,则可以直接匹配出“PLAIN”“LOGIN”“CRAM-MD5”这些词。另外一个小问题:
如果我想取以某个字符串“XXX”开头的行里不包含“XXX”内容的正则怎么写?

解决方案 »

  1.   

    try...string test = @"220 Welcome to TAP gateway for 263 
    ehlo "" 
    250-XFORWARD NAME ADDR PROTO HELO SOURCE 
    250-263.net 
    250-SIZE 47185920 
    250-ETRN 
    250-AUTH PLAIN LOGIN CRAM-MD5 
    250-AUTH=PLAIN LOGIN CRAM-MD5 
    250 8BITMIME 
    ";
    Regex reg = new Regex(@"(?m)(?<=250[-\x20]AUTH[=\x20](\S+\x20+)*)\S+(?=\x20+|$)");
    MatchCollection mc = reg.Matches(test);
    foreach (Match m in mc)
    {
        richTextBox2.Text += m.Value + "\n";
    }
    //输出
    PLAIN
    LOGIN
    CRAM-MD5
    PLAIN
    LOGIN
    CRAM-MD5
      

  2.   


    这种写法是错的,[^xxx]最终表示的是任意一个不是“x”的字符
    如果是[^abc]表示的是除“a”、“b”、“c”外的任意一个字符,虽然是任意,但只能是一个字符,排除的是字符,而不是字符序列如果我想取以某个字符串“XXX”开头的行里不包含“XXX”内容的正则怎么写?
    (?m)^XXX(?:(?!XXX).)*$
      

  3.   

    去看看咯~~自己研究哈~~应该能写的出来  http://www.cnblogs.com/KissKnife/archive/2008/03/23/1118423.html~正则表达试
      

  4.   

    感谢lxcnn,你写的表达式@"(?m)(?<=250[-\x20]AUTH[=\x20](\S+\x20+)*)\S+(?=\x20+|$)"里好多东西都是我不是很了解的(好好的学习了一下),回来一查RegBuddy的手册,才知道这些不少都是被RegBuddy归结为高级语法里的东西。呵呵。顺便把这些所谓高级的语法贴在了我的Blog,想了解的大伙也可以去看一下。