//標籤,ID 類 偽類 屬性的標識符 它們的主體部分,親子相鄰兄長並聯萬用字元,空白var reg = /[\w\u00a1-\uFFFF][\w\u00a1-\uFFFF-]*|[#.:\[][\w\(\)\]]+|\s*[>+~,*]\s*|\s+/g
//讓小括弧裡面的東西不被切割var reg = /[\w\u00a1-\uFFFF][\w\u00a1-\uFFFF-]*|[#.:\[](?:[\w\u00a1-\uFFFF-]|\([^\)]*\)|\])+|(?:\s*)[>+~,*](?:\s*)|\s+/g
//確保屬性選取器作為一個完整的詞素var reg = /[\w\u00a1-\uFFFF][\w\u00a1-\uFFFF-]*|[#.:](?:[\w\u00a1-\uFFFF-]|\S*\([^\)]*\))+|\[[^\]]*\]|(?:\s*)[>+~,*](?:\s*)|\s+/g
//縮小後代選取器的範圍var reg = /[\w\u00a1-\uFFFF][\w\u00a1-\uFFFF-]*|[#.:](?:[\w\u00a1-\uFFFF-]|\S+\([^\)]*\))+|\[[^\]]*\]|(?:\s*)[>+~,*](?:\s*)|\s(?=[\w\u00a1-\uFFFF*#.[:])/g
解決左邊沒用的空白字串
var reg_split = /^\s+|[\w\u00a1-\uFFFF][\w\u00a1-\uFFFF-]*|[#.:](?:[\w\u00a1-\uFFFF-]|\S+\([^\)]*\))+|\[[^\]]*\]|(?:\s*)[>+~,*](?:\s*)|\s+(?=[\w\u00a1-\uFFFF*#.[:])/g; var selectors = " [aaa=99] > dfdsf ,ggg eee iii "; // var selectors = " [aaa=eee] jjjj" // var selectors = " p span" var array = [],i=0,ri=0 selectors.replace(reg_split,function(selector){ if(selector == false){//如果為空白字串 i++ && (array[ri++] = " ");//並且並不是第一個捕獲的 }else if(selector.match(/^\s*([>+~,*])\s*$/)){ array[ri++] = RegExp.$1; }else { array[ri++] = selector; } }); alert("|"+array.join("|"));
修正無用空白字元的判定與偽類別選取器的匹配正則
var reg_split =/^\s+|[\w\u00a1-\uFFFF][\w\u00a1-\uFFFF-]*|[#.:][\w\u00a1-\uFFFF-]+(?:\([^\)]*\))?|\[[^\]]*\]|(?:\s*)[>+~,*](?:\s*)|\s(?=[\w\u00a1-\uFFFF*#.[:])/g; var selectors = " div:eq(0) "; var parts = [],i=0,ri=0 selectors.replace(reg_split,function(part){ i++ if(part == false ){//如果為空白字串 if(i) parts[ri++] = " ";//並且並不是第一個捕獲的 }else if(part.match(/^\s*([>+~,*])\s*$/)){ parts[ri++] = RegExp.$1; }else { parts[ri++] = part; } });
var reg_split = /^[\w\u00a1-\uFFFF\-\*]+|[#.:][\w\u00a1-\uFFFF-]+(?:\([^\)]*\))?|\[[^\]]*\]|(?:\s*)[>+~,](?:\s*)|\s(?=[\w\u00a1-\uFFFF*#.[:])|^\s+/;var slim = /\s+|\s*[>+~,*]\s*$/function spliter(expr) { var flag_break = false; var full = [];//這裡放置切割單個選取器群組得到的詞素,以“,”為界 var parts = [];//這裡放置切割單個選取器組得到的詞素,以關係選取器為界 do { expr = expr.replace(reg_split, function(part) { if (part === ",") {//這個切割器只處理到第一個並聯選取器 flag_break = true; } else { if (part.match(slim)) {//對關係,並聯,通符符選取器兩邊的空白進行處理 //對parts進行反轉,因為div.aaa,反轉後先處理.aaa full = full.concat(parts.reverse(), part.replace(/\s/g, '')); parts = []; } else { parts[parts.length] = part; } } return "";//去掉已經處理了的部分 }); if (flag_break) break; } while (expr) full = full.concat(parts.reverse()); !full[0] && full.shift();//去掉開頭第一個空白 return full;}var expr = " div > div#aaa,span"console.log(spliter(expr));//["div",">","#aaa", "div"]