それにしても見れば見るほどに、奥が深いですね〜
まずは、短いところから始めました。
正規表現で抜き出した部分を切り捨てないで弄ってみる
var parseTDCSort = function () { var Patterns = new RegExp ( '(?:' + '(\"[^\"]+\"|\'[^\']+\')' + // Atom("..." か '...' の文字列) '|([^-+;\\s]+)' + // Atom(演算子以外の文字からなる識別子) '|([-+])' + // '+', '-' '|(;)' + // ';' '|(\\s+)' + // 無視する空白 ')', 'g'); return function (stringData) { var result = [ ]; var dir = null; var ref = null; var paterns = new RegExp (Patterns); //←こっそり訂正 for (var cmp, qmp; (cmp = Patterns.exec (stringData)); ) { if ((qmp = cmp[1])) { if (ref) { throw new Error ('malformed TDC sort'); } ref = qmp.slice (1, -1); continue; } if ((qmp = cmp[2])) { if (ref) { throw new Error ('malformed TDC sort'); } ref = qmp; continue; } if ((qmp = cmp[3])) { if (dir) { throw new Error ('malformed TDC sort'); } dir = qmp; continue; } if ((qmp = cmp[4])) { if (ref) { result.push (dir || '+', ref); } dir = ref = null; continue; } } if (dir && ! ref ) { throw new Error ('謎の文字があります'); } if (ref) { result.push (dir || '+', ref); } return result; }; } ();
構文のエラーを無視するならば?
var str ='abc; -def; +ghi'; var reg = /\s*([\-\+])?([^\-\+]+)\s*(?:;|$)/g; while ((t = reg.exec (str))) result.push (t[1] || '+', t[2]);