2009-12-29 4 views
1

Я должен разделить эту строку здесь в JavaScript:Расширенный JavaScript расколоть

hl=windows xp \"windows xp\" 

в три слова.

я использовал:

keywords = keywords.split(/ /); 

Но тогда я получил 4 слова:

windows 
xp 
\"windows 
xp\" 

Как я мог разделить эту строку только 3 слова?

EDIT:. И как я удалить \»

+1

3 слова вы хотите? - Можете ли вы привести несколько примеров? –

+1

Предположительно плакат хочет: hl = windows, xp, "windows xp" –

+0

thats correct =) – ajsie

ответ

2

Простой:

keywords = keywords.match(/"[^"]*"|\w+/g).map(function(val) { 
    if (val.charAt(0) == '"' && val.charAt(val.lenngth-1) == '"') { 
     val = val.substr(1, val.length-2); 
    } 
    return val; 
}); 
+0

it работает отлично. но как вы напишите его как функцию, чтобы я мог поместить строку и получить массив? – ajsie

+0

он не работал на åäö и цифры, поэтому я изменил \ w на [a-ÖA-Ö0-9] – ajsie

+1

Вы также можете использовать '\ S' вместо' \ w'. – Gumbo

2
function split(s, on) { 
    var words = []; 
    var word = ""; 
    var instring = false; 
    for (var i = 0; i < s.length; i++) { 
     var c = s.charAt(i); 
     if (c == on && !instring) { 
      words.push(word); 
      word = ""; 
     } else { 
      if (c != '"') 
       word += c; 
     } 
     if (c == '"') instring = !instring; 
    } 
    if (word != '') words.push(word); //dangling word problem solved 
    return words; 
} 

и пример использования, который соответствует примеру OP в

var hl = "windows xp \"windows xp\""; 
split(hl, " "); // returns ["windows","xp","windows xp"] 
+0

Разве лучше не использовать регулярное выражение в split()? – ajsie

+0

не работал. он возвратил windows, xp – ajsie

+0

проблема с подходом регулярного выражения заключается в том, что ваша проблема не является достаточно регулярной, чтобы регулярное выражение легко выражало. исправлено проблема с болтающимся словом, вот что я получаю за не тестирование – barkmadley

2
hl="windows xp \"windows xp\"" 

var results = hl.split(/ /); 

for(var s in results) { 
    try { 
     while (results[s].search("\"") > -1) { 
      results.splice(s, 1); 
     } 
    } catch(e) {} 
} 

var quoted = hl.match(/"[^"]*"/g); //matches quoted strings 

for(var s in quoted) { 
    results.push(quoted[s]); 
} 

//results = ["windows", "xp", ""windows xp""] 

редактировать, а один лайнер:

var results = hl.match(/\w+|"[^"]*"/g).map(function(s) { 
    return s.replace(/^"+|"+$/g, "") 
}); 
+0

разве лучше просто использовать подходящее регулярное выражение в split()? – ajsie

+0

, но это была хорошая и работающая функция. thx – ajsie

+0

Верьте или нет, некоторые вещи сложнее делать с регулярными выражениями (но см. ответ Гумбо). – outis

Смежные вопросы