2017-01-07 4 views
6

文字列をカンマで区切りますが、角括弧内には区切りません。例えばコンマで区切りますが、正規表現を使用して角括弧内には入りません。

"[1, '15', [false]], [[], 'sup']" 

は、私は私の正規表現のための/\,(?=(.*\[.*\])*.*\]{1})/を試した

[ 
    "[1, '15', [false]]", 
    "[[], 'sup']" 
] 

に分かれますが、私のロジックは、[」の偶数が続いていないマッチカンマで] 'の間にある文字とその間にある文字の両方に1つの'] 'が続きます。

+0

が最初に配列リテラルです:あなたは、小さなパーサを書きたいかもしれません有効な配列の例? – guest271314

+0

@ guest271314:OPには*文字列*があると言われているので、これは文字列の内容と推定されます。 –

+0

@FelixKling _ "しかし、配列要素の中に入っていないとき" _初期の文字列を与えられたら、どの要素を配列要素にするか? ']]、[['? – guest271314

答えて

2

期待される結果にかかわらず、文字列は、文字列が適切である場合は、Array.prototype.reduce()String.prototype.split()String.prototype.replace()

var str = "[1, '15', [false]], [[], 'sup']"; 
 

 
var res = str.split(/,/).reduce((arr, text) => { 
 

 
    text = text.trim(); 
 

 
    if (arr.length === 0) { 
 
    arr.push([]); 
 
    } 
 
    
 
    if (/^\[/.test(text) && !/\]$/.test(text)) { 
 
    arr[arr.length === 1 ? 0 : arr.length - 1].push(text.slice(1)); 
 
    return arr 
 
    } 
 
    
 
    if (!/^\[/.test(text) && /\]$/.test(text)) { 
 
    arr[arr.length === 1 ? 0 : arr.length - 1].push(text.slice(0, -1)); 
 
    return arr 
 
    } 
 

 
    if (!/^\[/.test(text) && !/\]$/.test(text) 
 
     || /^\[/.test(text) && /\]{2}$/.test(text) 
 
     || !/\[|\]/.test(text)) { 
 
     arr[arr.length === 1 ? 0 : arr.length - 1].push(text); 
 
    return arr 
 
    } 
 
    
 
    if (/^\[{2}/.test(text) && /\]$/.test(text)) { 
 
    arr[arr.length - 1].push(text); 
 
    return arr 
 
    } 
 

 
    return arr 
 

 
}, []); 
 

 
var strs = `[${res.join()}]`.replace(/"/g, "").split(/,(?=\[{2})|"(?=")/); 
 

 
console.log(`str1:${strs[0]}\nstr2:${strs[1]}`);

0

を使用することができますjavascriptオブジェクトまたは有効なJSONとして解析可能かどうかの、二つの文字列であれば配列のような文字列...これは試してみる価値があるかもしれません:

var regex = /(\[.*?\]\])|(\[\[.*?\]$)|(\[(.*?)\])|(,)/gm; 
だから、

var regex = /(\[.*?\]\])|(\[\[.*?\]$)|(\[(.*?)\])|(,)/gm; 
 
str = "[1, '15', [false]], [[], 'sup']"; 
 
/*str="[1, [30] [false][,]], [[]false, 'sup'[]]"; 
 
str="[[] []], [1,4,5[8]]"; 
 
str="[[1,2,3],[3,6,7]],[[],566,[]]"; 
 
str="[[],[]],['duh,[],'buh',[]]"; 
 

 
str="[1,2,3],[5,'ggg','h']"*/ 
 

 

 
arr=[]; 
 
while ((matches = regex.exec(str)) !== null) { 
 
if(matches[0]!==',') 
 
arr.push(matches[0]); 
 

 
    
 
} 
 

 
console.log(arr);

、基本的には、代替グループと一致し、その結果をループ、非コンマの一致を保ちます。おそらく、場合によっては失敗しますが、もっとテストする必要があります。

1

正規表現は、このようなネストを含む状況にはあまり適していません。など

function parse(str) { 
 
    let result = [], item = '', depth = 0; 
 

 
    function push() { if (item) result.push(item); item = ''; } 
 

 
    for (let i = 0, c; c = str[i], i < str.length; i++) { 
 
    if (!depth && c === ',') push(); 
 
    else { 
 
     item += c; 
 
     if (c === '[') depth++; 
 
     if (c === ']') depth--; 
 
    } 
 
    } 
 
    
 
    push(); 
 
    return result; 
 
} 
 
     
 
console.log(parse("[1, '15', [false]], [[], 'sup']"));

あなたは、カンマの前後にスペースを処理するために、これを微調整したい場合、アンバランス角括弧、

+0

これは本当に素晴らしいです – JiniHendrix

関連する問題