顶楼的说明不清,这里再说一次.
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后面还有多少项也是不确定的.
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后面还有多少项也是不确定的.
解决方案 »
- 如何添加onmouseover,onmouseout,onclick 。
- 求一个方法思路
- 菜鸟急问,请问JavaScript如何实现二维数组。
- 如何获取包含了某个属性的 所有元素!??
- href和onclick并存的时候,链接不稳定,为什么
- stringbeans 里边结合jquery怎么又问题呢?请大虾们指教,谢谢了
- javascript如何取得name为aa[]的input的值
- 这么小的问题都没有人来解答吗?再发一次 我在线等
- 一个简单的问题 截取字符串
- 在javascript里写代码,在点击时显示一个图片,再点击时图片消失,请问高手怎么实现?
- 有一个项目问题,需要大家帮忙!
- 怎么用javascript写一个类似拖动条的东东??
+ " [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']相同
其他[...]的子串都不相同.
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;
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显然不符合要求.
你的意思是类似XML的一串,具有 相同数量 相同名称 但值不管相等与否 的“属性”?
-----------------------------------------------------------------------------------
你说的对.
我理解了你的意思,但我正则水平还没那么高,我有另一种思路:
写一个解析函数,解析出各段内容的属性名保存起来,然后再写一个函数来判断。
我这个思路的难点在第一步,但我觉得这个解析函数还是应该比正则容易写很多。
---------------------------------------------------------------------------
不用正则也可以,只要解决问题
定义一数组 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]含有一样的属性
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'];
第一步做到了,下一步该如何?
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]);
}
}
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);
}
{
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的每一项就含有是否也有相同属性组出现过,第一个出现的属性组含有具体有多少个。
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项属性组是一样的。
1.如果r[i]含有Et属性,则表示它与r中第Et项属性组是一样的,此时r[i].T属性值为1但不应使用它;
2.否则r[i].T即代表此属性组共有多少次。
2.否则r[i].T即代表此属性组共有多少次。----------------------------------------------------------
这种语法那里有教程?
是比较基础的东西。
有人称之为expando特性。从语法来理解,基于原型的编程语言都应有此特性。
称JS为基于对象那是与面向对象相比较,而我觉得更准确的说法是基于prototype(原型)