如下功能怎么用正则表达式的方式实现?int p5 = 0;
int p6 = 0;
int p = 0;for (int i = 0; i < source.Length; i++)
{
    if (source[i] == '&')
    {
        p++;        if (p == 5) p5 = i;
        else if (p == 6) p6 = i;
    }
}if (p5 > 0 && p6 > 0)
    return source.Substring(p5 + 1, p6 - p5 - 1);
else return string.Empty;

解决方案 »

  1.   


    (?<=(.*?(?:&)){5})[^&]*
      

  2.   

    [code=C#]string str = "&111&22&11&22&fsfs22&22&11&22&";
                Regex reg = new Regex(@"(?<=(?:.*&){5}).*?(?=&)");
                MessageBox.Show(reg.Match(str).Value);code]
      

  3.   

    string str = "&111&22&11&22&fsfs22&22&11&22&";
                Regex reg = new Regex(@"(?<=(?:.*&){5}).*?(?=&)");
                MessageBox.Show(reg.Match(str).Value);
      

  4.   

    召唤lxcnn吧,他是正则达人。不过还是少用正则的好,对于规则字符串查找,使用常规方法比正则更快。
      

  5.   

    看来mbh0210 的正则已经炉火纯青了啊
    (?<YOurNeed>(?<=(.*?(?:&)){5})[^&]*)
      

  6.   

    using System;
    using System.Text.RegularExpressions;class Test
    {
      static void Main()
      {
        foreach (string s in new string[]{"abc", "&&1&&&123&.&.", "i&u"})
        {
          Console.WriteLine("{0}: [{1}]", s, Get5And6(s));
        }
      }
      
      // 取第5个&和第6个&之间的字符串
      static string Get5And6(string s)
      {
        return Regex.Match(s, @"(?s)(?:[^&]*&){5}([^&]*)&").Groups[1].Value;
      }
    }
    /* 程序输出:
    abc: []
    &&1&&&123&.&.: [123]
    i&u: []
    */
      

  7.   

    从 LZ 提供的程序来看,对 "&&&&&NO6" 应该返回空字符串,2楼和6楼的都不符合 LZ 的原意。
      

  8.   


    这个写法很接近了,但是后续的&之间的之后的都被匹配到了
      

  9.   

    8 楼的应该可以了:return Regex.Match(s, @"(?:[^&]*&){5}([^&]*)&").Groups[1].Value;
      

  10.   


    如果&有6个以上的话,这个写法会匹配到第6个和第7个之间的,第7第8之间的...
      

  11.   

    (?:[^&]*&){5}([^&]*)取Groups[1].Value
      

  12.   

    或者这样写可以:
    return Regex.Match(s, @"(?<=([^&]*&){5})[^&]*(?=&)").Value;
      

  13.   


    &&1&&&123&.&. 匹配结果: &&1&&&123&
      

  14.   


    试试这个,获取info^.*?(?:&)(.*?(?:&)){4}(?<info>[^&]*)
      

  15.   


    我的程序运行结果是:&&1&&&123&.&. 匹配结果:[123]
      

  16.   

    注意 ,8楼的程序是:return Regex.Match(s,@"(?:[^&]*&){5}([^&]*)&").Groups[1].Value; 
      

  17.   

    string str ="&&&111&22&33&123&&44&55&6662&7771&888888&"; 
                Regex reg = new Regex(@"(?<=(?:.*&){5}).*?(?=&)");
                MessageBox.Show(reg.Match(str).Value);
    得到的是33
      

  18.   

    LZ,请注意 8 楼和 17 楼的区别,8 楼的有 .Groups[1] ,17 楼的没有。
      

  19.   


    如果是:
    string str = "&&\n&111&22&33&123&&44&55&6662&7771&888888&"; 那么,用 .* 就不正确了。
      

  20.   

    正则的算法大家有不有深入了解过啊,
    可能是微软把算法封在Regex 类中了,
    它只是看起来代码短一点而以,让我们省了很多事,
    执行效力应该快不到哪去
      

  21.   


    以上都不太好
    这个"(?n)(?<=^([^&]*&){5})[^&]*"  
    // 注意有个^表示开始的标志位才行,要不就会将第5第6之间的第6第7等等匹配出来。
    // 因为(?<=exp)是零消耗的会从头开始一个一个字符的匹配整个正则 找到匹配的。
      

  22.   

    修改一下  不足六个 不匹配"(?n)(?<=^([^&]*&){5})[^&]*(?=&)"另外"(?n)^([^&]*&){5}(?<value>[^&]*)&""(?sn)^(.*?&){5}(?<value>.*?)&"
    以上都可以  但要有 ^ 在开头
      

  23.   

    因为:
    return Regex.Match(s, @"(?<=([^&]*&){5})[^&]*(?=&)").Value;
    这是返回第一个匹配(如果存在匹配的话),所以没有加 ^ 也不会匹配到6、7个之间。又没有调用 NextMatch(),所以不存在 wackyboy 说的问题,你的担心是没有必要的。
      

  24.   


    如果这个对效率要求较高,那么肯定是自己写状态机效率高的,楼主的方法用StringBuilder改进一下就是了如果非要用正则,8楼、17楼、34楼的都可以,最近工作太忙,大脑有些秀逗,不太适合回答问题
      

  25.   


    在整个源字符串匹配成功的情况下,加不加“^”没什么区别,在整个源字符串匹配不成功的情况下,wackyboy 的考虑还是有必要的
      

  26.   


    在整个源字符串匹配不成功的情况下,会直接 return 一个空字符串,wackyboy 的考虑还是有必要吗?
      

  27.   


    汗!我只用了substring,又没有用字符串相加,stringbuilder怎么帮我改进?
    难道你是说找到第5个&后设置标志,直到第6个&前的字符每个都加起来吗?这样比substring效率会高吗?我确实不知道。
    (ps:突然发现我的代码确实有应该改进的地方,很明显少了一个break)
      

  28.   


    不用Substring,这样的效率低
    不过如果涉及到效率,那可能要考虑算法了,这个要找wuyi8808了,wuyi8808是算法高手
      

  29.   

    string str = "&111&22&11&22&fsfs22&22&11&22&"; 
    Regex reg = new Regex("(?:[^&]*&){5}(?<value>[^&]*)&");
    Match m = reg.Match(str);
    if(m.Success) 
    {
        MessageBox.Show("获取的字符串是:"+reg.Groups["value"].Value);
    }
    else
        MessageBox.Show("字符串中没有包含6个以上的&字符");