2015-04-05 31 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]); 

這是給結果爲:分割字符串跳過分裂性格

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

我在哪裏尋找以下結果:

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

我是正確的假設你想根據它們是否在引用字符串內部而忽略逗號? – Touffy 2015-04-05 16:33:48

+0

是的,這是我在尋找 – Bharat 2015-04-05 16:37:54

+1

是啊,這是一個重複的問題,但不幸的是答案不是很好,因爲它忽略了逃脫引號的可能性(''\「'') – Touffy 2015-04-05 17:08:53

回答

0

解析分隔符,如引號(或parens,括號等,但特別引用ac偶然的原因)最好用CFG解析器完成,而不是正則表達式。但它很容易,並且在O(n)時間內完成,這與正則表達式相同,並且比您最終可能用於這類事情的不規則表達式更好(RE是本地化的)。

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

''這將會\\「,'break','\\','''' – 2015-04-05 18:22:48

+0

您目前的符號表示任何偶數個反斜槓都不計算,因此變成(?:\ \\\\)* \\ – Touffy 2015-04-05 18:22:54