顶楼的说明不清,这里再说一次.
String str="("
+  "     [col0='xxx' and col2='yyy']"
+  " and [col0='xxx']"
+  " and [col0='xxx' and col2='yyy']"
+  " and [col0='xxx' and col1='yyy' and col2='zzz']"
+  ")";
如何用正则来统计[col0='xxx' and col2='yyy']这样的子字符串有两个.而其他和字串各只有一个.注意xxx,yyy,zzz所代表的内容都是不定的,col和col0,col2代表的内容也是不固定的.如:1,[name='小强' and age='20']  和 [name='大强' and age='30']  这两者应当看作相同.2,[adrr='和平路' and no='2000'] 和 [name='小强' and age='20'] 这两者应看作不同.3,[name='小强' and age='20']  和 [name='小强'] 和 [age='20'] 这三者应看作不同.4,[name='小强' and age='20' ] 和 [name='小强' and age='20' and addr='和平路'] 这两者也应该看作不同.5,[name='小强' and age='20' and addr='和平路' and .....] and后面还有多少项也是不确定的.

解决方案 »

  1.   

    String str="("
    +  "     [name='小强' and age='20']"
    +  " and [name='小强']"
    +  " and [age='20']"
    +  " and [name='大强' and age='30']"
    +  " and [name='小强' and age='20' and addr='和平路']"
    +  " and [adrr='和平路' and no='2000']"
    +  ")";------------------------------------------------
    要得到的结果是:
    [name='小强' and age='20'] 和[name='大强' and age='30']相同
    其他[...]的子串都不相同.
      

  2.   

    var reg = /\[\s*name='[^']*?'\s+and\s+age='[^']*?'\s*\]/g;
    var str = "[name='小强' and age='20'] and [name='小强'] and [age='20'] and [name='大强' and age='30'] and  [name='小强' and age='20' and addr='和平路'] and [adrr='和平路' and no='2000']";
    var ar = str.match(reg);
    alert(ar.length);结果是2,说明有两个同一模式的子串
      

  3.   

    你的意思是类似XML的一串,具有 相同数量 相同名称 但值不管相等与否 的“属性”?
      

  4.   

    zhaoxiaoyang(梅雪香@深圳) ( ) 信誉:100    Blog 
    var reg = /\[\s*name='[^']*?'\s+and\s+age='[^']*?'\s*\]/g;
    var str = "[name='小强' and age='20'] and [name='小强'] and [age='20'] and [name='大强' and age='30'] and  [name='小强' and age='20' and addr='和平路'] and [adrr='和平路' and no='2000']";
    var ar = str.match(reg);
    alert(ar.length);结果是2,说明有两个同一模式的子串---------------------------------------------------------------------要是这样行的话,我也不来问了.var reg = /\[\s*name='[^']*?'\s+and\s+age='[^']*?'\s*\]/g;1,name,age不能写死在正则中,这两个地方可以是任意内容.
    2,要计算的串有可能是[name='小强' and age='20']  ,[name='小强'], [age='20'],[name='小强' and age='20' and addr='和平路'],[name='小强' and age='20' and addr='和平路' and .....] and后面还有多少项也是不确定的,reg显然不符合要求.
      

  5.   

    Amwpfiqvy(ContextMenu) ( ) 信誉:100    Blog  2006-11-11 21:49:52  得分: 0  
     
     
       你的意思是类似XML的一串,具有 相同数量 相同名称 但值不管相等与否 的“属性”?
      
     
    -----------------------------------------------------------------------------------
    你说的对.
      

  6.   

    Amwpfiqvy(ContextMenu) ( ) 信誉:100    Blog  2006-11-11 22:30:57  得分: 0  
     
     
       我理解了你的意思,但我正则水平还没那么高,我有另一种思路:
    写一个解析函数,解析出各段内容的属性名保存起来,然后再写一个函数来判断。
    我这个思路的难点在第一步,但我觉得这个解析函数还是应该比正则容易写很多。  
     
    ---------------------------------------------------------------------------
    不用正则也可以,只要解决问题
      

  7.   

    第一步过程:
    定义一数组 r = [];//r里每一项也是数组保存下面item[i]中的所有属性名
    先ary = str.split( " and " );
    再var item = ary[i];//弄成全是"[at1='v1' and at2='v2']"的样子
    对item[i]的解析类似
    第二步过程:
    对r的第一项r[i] = r[i].sort();
    然后就判断r[i].toString()与另一r[j].toString()是否一样,一样则说明ary[i]与ary[j]含有一样的属性
      

  8.   

    对r的第一项r[i] = r[i].sort();//这个我没看懂干什么用?
      

  9.   

    <script>
    var reg = /\[(\s*(and)?\s*(\w+)='[^']*?'\s*)+\]/g;
    var str = "[name='小强' and age='20'] and [name='小强'] and [age='20'] and [name='大强' and age='30'] and  [name='小强' and age='20' and addr='和平路'] and [adrr='和平路' and no='2000']";
    var ar = str.match(reg);
    for(var i=0;i<ar.length;i++){
    document.writeln(ar[i]+";");
    }</script>结果:
    [name='小强' and age='20']; [name='小强']; [age='20']; [name='大强' and age='30']; [name='小强' and age='20' and addr='和平路']; [adrr='和平路' and no='2000']; 
    第一步做到了,下一步该如何?
      

  10.   

    var r = [];
    for( var i = 0; i < ar.length; i++ )
    {
      var item = ar[i].substr(1,ar[i].length-2);//去掉'['与']'
      var tmp = item.split(/=| and /gi);
      for( var j = 0; j < tmp.length; j+=2 )
      {
        r.push(tmp[j]);
      }
    }
      

  11.   

    这样才对:
    var r = [];
    for( var i = 0; i < ar.length; i++ )
    {
      var item = ar[i].substr(1,ar[i].length-2);//去掉'['与']'
      var tmp = item.split(/=| and /gi);
      var ary1 = []
      for( var j = 0; j < tmp.length; j+=2 )
      {
        ary1.push(tmp[j]);
      }
      r.push(ary1);
    }
      

  12.   

    function Eq( r )
    {
      for( var i = 0; i < r.length; i++ )
      {
        if( !r[i].T )
        {
          r[i].T = 1;
        }
        if( r[i].Et )
        {
          continue;
        }
        for( var j = i+1; j < r.length; j++ )
        {
          if( r[i].toString() == r[j].toString )
          {
            r[j].Et = i;
            r[i].T++;
          }
        }
      }
    }调用以后r的每一项就含有是否也有相同属性组出现过,第一个出现的属性组含有具体有多少个。
      

  13.   

    楼上的代码我看不懂呀,r[j].Et 这种代码是不是伪代码呀?
      

  14.   

    不是,下面是完整且修改了几个小错误后的结果,解析结果全在r中,含义也说明,你测一下,有问题再改。
    PopUp菜单
    var reg = /\[(\s*(and)?\s*(\w+)='[^']*?'\s*)+\]/g;
    var str = "[name='小强' and age='20'] and [name='小强'] and [age='20'] and [name='大强' and age='30'] and  [name='小强' and age='20' and addr='和平路'] and [adrr='和平路' and no='2000']";
    var ar = str.match(reg);
    var r = [];
    for( var i = 0; i < ar.length; i++ )
    {
      var item = ar[i].substr(1,ar[i].length-2);//去掉'['与']'
      var tmp = item.split(/=| and /gi);
      var ary1 = []
      for( var j = 0; j < tmp.length; j+=2 )
      {
        ary1.push(tmp[j]);
      }
      r.push(ary1.sort());
    }Eq( r );
    function Eq( r )
    {
      for( var i = 0; i < r.length; i++ )
      {
        if( !r[i].T )
        {
          r[i].T = 1;
        }
        if( r[i].Et != null )
        {
          continue;
        }
        for( var j = i+1; j < r.length; j++ )
        {
          if( r[i].toString() == r[j].toString )
          {
            r[j].Et = i;
            r[i].T++;
          }
        }
      }
    }====
    r[i].T即代表此属性组共有多少次
    如果r[i]不含T,则必有Et属性,Et表示它与r中第Et项属性组是一样的。
      

  15.   

    最后的说明有点不妥当,而且有一处toString忘记加括号if( r[i].toString() == r[j].toString() )
    1.如果r[i]含有Et属性,则表示它与r中第Et项属性组是一样的,此时r[i].T属性值为1但不应使用它;
    2.否则r[i].T即代表此属性组共有多少次。
      

  16.   

    1.如果r[i]含有Et属性,则表示它与r中第Et项属性组是一样的,此时r[i].T属性值为1但不应使用它;
    2.否则r[i].T即代表此属性组共有多少次。----------------------------------------------------------
    这种语法那里有教程?
      

  17.   

    这个原理应该是JS教程都会提到,你随便找本书应该都有说。
    是比较基础的东西。
    有人称之为expando特性。从语法来理解,基于原型的编程语言都应有此特性。
    称JS为基于对象那是与面向对象相比较,而我觉得更准确的说法是基于prototype(原型)
      

  18.   

    r[i].T,r[i].Et//这样的属性是你自定义的吧?