2017-01-07 1 views
6

괄호 안에 문자열을 쉼표로 구분하고 싶습니다. 예를 들어쉼표로 쉼표로 구분하지만 정규식을 사용하는 대괄호 안에는 사용하지 않습니다.

:

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

나는 내 정규 표현식에 대한 /\,(?=(.*\[.*\])*.*\]{1})/을 시도했습니다

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

로 분할 것, 내 논리는 [ '짝수가 따르지 일치 쉼표입니다 ] '사이의 문자와 그 사이에 하나의 문자가 뒤따라' ''. 예상 된 결과는 두 개의 문자열에 관계없이 여부 문자열입니다 javascript 개체 또는 유효 JSON 같은 구문 분석하는 경우는 Array.prototype.reduce(), String.prototype.split()을 사용할 수 있습니다

+0

처음에는 배열 리터럴 : 당신은 작은 파서를 작성 할 수 있습니다 유효한 배열의 예? – guest271314

+0

@ guest271314 : OP에 * 문자열 *이있어 문자열의 내용으로 추정됩니다. –

+0

@FelixKling _ "배열 요소 안에있을 때가 아닙니다."_ 초기 문자열이 주어지면 배열 요소를 결정하는 방법은 무엇입니까? ']], [['? – guest271314

답변

2

, 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

문자열이 적절한 경우 배열과 같은 문자열 ... 어쩌면 이것도해볼 가치가 있습니다 :

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

63,210

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

Regexp는 중첩과 관련된 상황에는 적합하지 않습니다. 등

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

관련 문제