2013-06-05 52 views
3

任何機構都可以告訴我在java腳本中分割一個字符串,其中的空格不在單引號內。使用空格分隔值標記字符串,除非值用單引號括起來

一樣,如果字符串是

 
"0 60 120 180 'node name' 2 34 45 12" 

那麼它將記號化,使得

 
arr[0]=0 
arr[1]=60 
arr[2]=120 
arr[3]=180 
arr[4]='node name' 
arr[5]=2 
arr[6]=34 
arr[7]=45 
arr[8]=12 

在拆分,如果單引號然後刪除也不錯,因爲這是在圖表圖例中的名字,我要取在單個元素中的名稱

+0

是否有逃避單引號的方式需要被處理? – Bergi

+0

使用此正則表達式..「([^」] *)「 – Rinku

+0

最舊的重複我已經[在這裏找到](http://stackoverflow.com/search?q=javascript+split+string+space+quote):[ parsings strings:extraction words and phrases](http://stackoverflow.com/questions/64904/parsings-strings-extracting-words-and-phrases-javascript)另一個值得注意的是:http://stackoverflow.com/q/ 2817646 – Bergi

回答

5

這個正則表達式會這樣做:

var arr = string.match(/'[^']*'|[^ ]+/g) || []; 
+0

** + 1 **尼斯答:) – 2013-06-05 09:48:57

+0

感謝@Bergi它的正常工作 –

+0

+1善於思考 –

0

如果您沒有嵌套引號,這將工作。首先,我搜索的字符串中的單引號,然後分裂的space

var s = "0 60 120 180 'node name' 2 34 45 12"; 
var a = s.split("'"); 
var r = []; 
for (var i = 0, l = a.length; i <l; i++) { 
    if (i % 2) { 
     r.push("'" + a[i] + "'"); 
    } 
    else { 
     var x = a[i].split(' '); 
     for (var j = 0, k = x.length; j < k; j++) { 
      if (x[j] != '') { 
       r.push(x[j]); 
      } 
     } 
    } 
} 

console.log(r); 
// ["0", "60", "120", "180", "'node name'", "2", "34", "45", "12"] 
+0

我對'%'Modulus運算符有點粗略。如果(i \ 2)是真的(有餘數)做別的事情(如果它是假的)做一些其他的事情(如果它完全分開) –

+0

@MarkWalters正確:'if(i%2)如果(i%2)'表示如果(我不能被2整除)' –

+0

@JanDvorak啊哈,謝謝你。實質上,對於所有奇數,使用'%2'將返回true。 –

3

你可以這樣做:

var s = "0 60 120 180 'node name' 2 34 45 12"; 
var arr = []; 
s.split("'").forEach(function(v,i){ 
    arr = arr.concat(i%2 ? v : v.trim().split(' ')) 
}); 

它也消除了單引號:

["0", "60", "120", "180", "node name", "2", "34", "45", "12"] 

Demonstration

+1

我嘗試確切您發佈,但沒有工作 –

+0

@ user571616見演示:http://jsfiddle.net/F3BxE/ –

+0

請在IE 8在IE 8看這個,我的系統中,這不是工作,而是是在Firefox它的工作原理 –

0

想想我可能會有點晚,它有點冗長,但它是一個容易理解和一般的解決方案。適用於所有分隔符和「連接」字符。還支持長度超過兩個單詞的「加入」單詞......即列表像「你好我的名字是'jon delaware smith fred'我有一個'長名字'」......

On @ BERGI的提醒我已有點不太詳細...

function split(input, delimiter, joiner){ 
    var output = []; 
    var joint = []; 
    input.split(delimiter).forEach(function(element){ 
     if (joint.length > 0 && element.indexOf(joiner) === element.length - 1) 
     { 
      output.push(joint.join(delimiter) + delimiter + element); 
      joint = []; 
     } 
     if (joint.length > 0 || element.indexOf(joiner) === 0) 
     { 
      joint.push(element); 
     } 
     if (joint.length === 0 && element.indexOf(joiner) !== element.length - 1) 
     { 
      output.push(element); 
      joint = []; 
     } 
    }); 
    return output; 
    } 
+1

「有點冗長」頗爲輕描淡寫:-)這將是更好的理解,如果你沒有使用一些標準的數組方法。 – Bergi

+0

我只使用split,length和push .....然後indexof爲字符串。有2個數組和3個ifs雖然,哈哈。我並不是說沒有太多的代碼。我想如果我使用了更多的內置東西像concat和forEach ....我可能會編輯它,如果我得到一分鐘。 – tigerswithguitars

0

ES6解決方案,支持:

  • 通過分割空間,除了引號內
  • 去掉引號,而不是反斜線報價
  • 逃逸報價成爲報價
  • 可以把報價隨時隨地

代碼:

string.match(/\\?.|^$/g).reduce((p, c) => { 
     if(c === "'"){ 
      p.quote ^= 1; 
     }else if(!p.quote && c === ' '){ 
      p.a.push(''); 
     }else{ 
      p.a[p.a.length-1] += c.replace(/\\(.)/,"$1"); 
     } 
     return p; 
    }, {a: ['']}).a 

輸出:

[ '0', '60', '120', '180', 'node name', '2', '34', '45', '12' ] 
相關問題