2013-06-05 1 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): [ строки разбора: извлечение слов и фраз] (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 ** Хороший ответ :) –

+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

Я немного отрывочен с оператором '%' Moduleulus.Делает ли ваш оператор if 'if (i% 2)' read - if (i \ 2) правдивым (имеет остаток) делать что-то еще (если это ложь) делать что-то другое (если оно точно делит) –

+0

@MarkWalters correct: ' if (i% 2) 'означает' if (i не делится на 2) ' –

+0

@JanDvorak Aha, благодарю вас. По сути использование '% 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 @ посоветуй Берг, я бы сделал это немного компактнее ...

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 ..... then indexof для строк. Есть 2 массива и 3 ifs, хотя, lol. Я не говорю, что кода недостаточно. Я думаю, если бы я использовал больше встроенных вещей, таких как concat и forEach .... Я мог бы отредактировать его, если я получу минута. – tigerswithguitars

0

ES6 решения поддержки:

  • Split пространством для внутренних котировок
  • удалить кавычки, за исключением, но не для обратных косых кавычек экранированы
  • Сбежал цитата стала цитата
  • Можно поставить кавычки в любом месте

Код:

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' ] 
Смежные вопросы