字符串形如:JOIN [XXX] ON a=b and x=y 
已知只有1个Join,只有1个ON。
我要取得的是[XXX],规则就是在Join之后,在On出现之前的内容,但是中括号中出现的ON则不算。比如
Join [xxx on yyy] ON a=b and x=y
这个也是合法的输入,这种情况下需要取得是[xxx on yyy]求正则。

解决方案 »

  1.   

    @"(?i)(?<=\bJOIN\s*)\[[^\]]+\](?=\s*ON\b)"
      

  2.   

    string[] items = Regex.Split(Regex.Match("JOIN [XXX] ON a=b and x=y","(?is)(?<=join\s*\[)[^\]]+").Value,"(?i)\s*on\s*");
      

  3.   

    不好意思忘记说了,中括号是不一定有的!
    比如完全可以是
    JOIN XXX ON a=b and x=y这时候取得XXX
      

  4.   

    那么这个怎么算:
    Join xxx on yyy ON a=b and x=y
    是取 xxx 还是取 xxx on yyy ?
      

  5.   

    // 取尽量少的内容(取出的内容中不含ON):
    @"(?si)(?<=\bJOIN\s*).*?(?=\s*ON\b)"// 取尽量多的内容(可以含ON):
    @"(?si)(?<=\bJOIN\s*).*(?=\s*ON\b)"
      

  6.   


    这种情况认为非法输入,就是说不在中括号内的on只能有一个,中括号内的on可以有多个。
      

  7.   

    本帖最后由 lxcnn 于 2010-05-17 18:53:28 编辑
      

  8.   

    如果不包含在[]中,还会有空白字符吗?如果可能有Regex reg = new Regex(@"(?is)JOIN\s*(\[[^\[\]]*\]|.+?)\s*ON");
    MatchCollection mc = reg.Matches(yourStr);
    foreach (Match m in mc)
    {
        richTextBox2.Text += m.Groups[1].Value + "\n";
    }
      

  9.   

    Regex reg = new Regex(@"(?is)JOIN\s*(\[[^\[\]*\]|\S+)\s*ON");
    MatchCollection mc = reg.Matches(yourStr);
    foreach (Match m in mc)
    {
       richTextBox2.Text += m.Groups[1].Value + "\n";
    }
      

  10.   

    bs楼上复制答案灌水的。
    客客师傅来了。yeah.`