2015-04-05 3 views
0
var str = '"testStr, 10.0 pl",NA,4.6'; 
var rawLine = str.split(','); 
console.log(rawLine[0]); 
console.log(rawLine[1]); 
console.log(rawLine[2]); 

Это дает результат, как:Разбивает строку в JavaScript, пропуская расщепляющу- персонажу

""testStr" 
"10.0 pl"" 
"NA" 

Где я ищу ниже результата:

"testStr, 10.0 pl" 
"NA" 
"4.6" 
+1

Я правильно считать что вы хотите игнорировать запятые, исходя из того, находятся ли они внутри строк с кавычками? – Touffy

+0

Да, что я ищу – Bharat

+1

Да, это дубликат этого вопроса, но, к сожалению, ответ там не очень хорош, так как он игнорирует возможность экранированных кавычек ('' \ '' ') – Touffy

ответ

0

Разделительные разделители, такие как кавычки (или парсеры, скобки и т. Д., Но особенно кавычки для переменного тока ouple причин) лучше всего делать с синтаксическим анализатором CFG, а не с регулярными выражениями. Но это довольно просто и сделано в O (n) времени, которое совпадает с регулярными выражениями, и лучше, чем нерегулярные выражения, которые вы могли бы использовать для такого рода вещей (REs являются родными, хотя).

function parseStrings(str){ 
    var parse=[], inString=false, escape=0, end=0 

    for(var c=0; c<str.length; c++) switch(str[c]){ 
    case '\\': escape^=1; break 
    case ',': if(!inString){ 
     parse.push(str.slice(end, c)) 
     end=c+1 
     } 
     escape=0 
     break 
    case '"': if(!escape) inString=!inString 
    default: escape=0 // fallthrough from previous case 
    } 
    if(inString) throw SyntaxError('expected matching " at the end of the string') 
    if(end<c) parse.push(str.slice(end, c)) 
    return parse 
} 

Это может быть расширено, чтобы разобрать одиночные кавычки строки и другие разделители тоже (вы должны построить стек для не кавычек). Я отправил модифицированную версию, которая обрабатывает как одиночные и двойные кавычки в Regex to pick commas outside of quotes

1

Если вы предпочли бы не разобрать, как говорит другой ответ, я хотел бы разделить на цитируемые выражениях и запятых:

function split_string_on_commas_outside_quotes(str) { 

    return str . 

    // Replace escaped quotes; will put back later. 
    replace(/\\"/g, "__QUOTE__") . 

    // Split on quoted strings and commas, but keep in results. 
    // Use feature of split where groups are retained in result. 
    split(/(".*?"|,)/) . 

    // Remove empty strings and commas from result. 
    filter(function(piece) { return piece && piece !== ','; }) . 

    // Remove quotes at beginning and end of quoted pieces as you want. 
    map(function(piece) { return piece.replace(/^"|"$/g, '') }) . 

    // Restore escaped quotes. 
    map(function(piece) { return piece.replace(/__QUOTE__/g, "\\\""); }) 
    ; 

} 

>> var str = '"testS\"tr, 10.0 pl",NA,4.6' 
>> split_string_on_commas_outside_quotes(str) 
<< ["testS\"tr, 10.0 pl", "NA", "4.6"] 
+0

'' this will \\ ", break," \\ "," "' –

+0

вещь с экранирующими кавычками заключается в том, что любое четное число обратных косых черт не учитывается, так что становится (?: \ \\\\) * \\ – Touffy