求正则表达式,难度有点大

likeajin 2011-07-22 09:02:49
有一个字符串,按照一定格式分隔为数组,例:

var a='a b:{a:"a b c"} c d:{a:"a b c",b:"x y"} e',b;
var reg=/ /;//正则表达式,以空格为分隔符,注意{}中的空格,任意一对{}中的空格都不参与分割
b=a.split(reg);//需要得到结果为['a','b:{a:"a b c"}','c','d:{a:"a b c",b:"x y"}','e']

a="b:{a:'a b c'}";
reg=/ /;//正则表达式,以第一个':'为分隔符,只是第一个':'
b=a.split(reg);//需要得到的结果为['b','{a:"a b c"}']

...全文
244 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
loveajin 2011-07-22
  • 打赏
  • 举报
回复
抱歉,上面的代码少了分割的那个步骤了,楼主应该懂得 :)
loveajin 2011-07-22
  • 打赏
  • 举报
回复
不知道楼主是不是这么想的,把元素用空格分开,元素可能为对象类型或者其他各种类型。如果是的话就反过来想吧,先获取了各种类型的所有元素,然后再分割。贴上代码,供参考:

var test='a a:{a:{a:{a:"a b"},b:"a b"},b:{}} c:{c:"a b c"} b c';

var reg=/[^ ]*{.*}/;
var objs=test.match(reg);
test=test.replace(reg,'');

//其他类型的元素……
reg=/ /;
objs=test.match(reg);
test=test.replace(reg,'');

……

至于第二个,就像7楼说的,建议使用replace替换掉第一个冒号再分割吧
挨踢直男 2011-07-22
  • 打赏
  • 举报
回复
var regex = / (?=([^}]+\{)|[^ ]+$)/g;
var str = 'a b:{a:"a b c"} c d:{a:"a b c",b:"x y"} e';
str = str.replace(regex,"~").split("~")
document.write("['"+str.join("','")+"']");//数组
//['a','b:{a:"a b c"}','c','d:{a:"a b c",b:"x y"}','e']
//---------------
document.write("<br/>")
str = "b:{a:'a b c'}";
str = str.split(/\:(?=\{)/);//数组
document.write('["'+str.join('","')+'"]')
//["b","{a:'a b c'}"]
  • 打赏
  • 举报
回复
正则不是万能的,一版不要用它来处理只截取第几个这类的操作。
var a='a b:{a:"a b c"} c d:{a:"a b c",b:"x y"} e',b;
var reg=/(\w+:\{.*?\})|(\w+)/g;
var b = [];
var match;

while( match = reg.exec(a) ){
b.push(match[0]);
}

alert(b.join(' | '));

var c = [], s="b:{a:'a b c'}", index = s.indexOf(':') ;
if( index > -1 ){
c.push(s.slice(0, index));
if( index < s.length - 1 ){
c.push(s.slice(index+1))
}
}else{
c.push[s];
}

alert(c.join(' | '));
knightzhuwei 2011-07-22
  • 打赏
  • 举报
回复

var a="b:{a:'a b c'}";
reg=/:(?=.*$)/;
b=a.split(reg);
alert(b);
OPPPPOP 2011-07-22
  • 打赏
  • 举报
回复

var a='a b:{a:"a b c"} c d:{a:"a b c",b:"x y"} e';
a='}'+a+'{';
a=a.replace(/\}([^\{\}]*)\{/g,function (){return '}'+arguments[1].replace(/ /g,'\\ ')+'{';});
a=a.replace(/^}|{$/g,'');
alert(a.split(/\\ /).join('----'));

我加了一个"\"区分大括号外面的空格 LZ可以根据具体情况换成其他
第二个 类似于第一个 把" "格换成":"就行了
001007009 2011-07-22
  • 打赏
  • 举报
回复
mark。。
kyzy_yy_pm 2011-07-22
  • 打赏
  • 举报
回复
第二个

var a = "b:{a:'a b c'}";
var r = /(.*):({.*})/;
a = r.test(a);
var arr = new Array(RegExp.$1, RegExp.$2);
alert(arr)
q107770540 2011-07-22
  • 打赏
  • 举报
回复
1. (?<!{[^}]*)\s
貌似JS正则不支持 (?<!)

2.可不可以理解为 {} 内的 : 不参与分组?
confidenceyu 2011-07-22
  • 打赏
  • 举报
回复
/\s*$/
第二个不会。。
likeajin 2011-07-22
  • 打赏
  • 举报
回复
还有没有其他思路和意见的?

87,989

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧