разделить строку JavaScript по пробелам или по кавычкам в массиве - PullRequest
22 голосов
/ 12 мая 2010
var str = 'single words "fixed string of words"';
var astr = str.split(" "); // need fix

Я хочу, чтобы массив был похож: одиночный, слова, фиксированная строка слов.

Ответы [ 8 ]

27 голосов
/ 12 мая 2010
str.match(/\w+|"[^"]+"/g)

//single, words, "fixed string of words"
21 голосов
/ 06 сентября 2013

Принятый ответ не совсем корректен. Он разделяется на непробельные символы, такие как. и - и оставляет кавычки в результатах. Лучший способ сделать это так, чтобы исключить кавычки, - использовать группы захвата, например:

//The parenthesis in the regex creates a captured group within the quotes
var myRegexp = /[^\s"]+|"([^"]*)"/gi;
var myString = 'single words "fixed string of words"';
var myArray = [];

do {
    //Each call to exec returns the next regex match as an array
    var match = myRegexp.exec(myString);
    if (match != null)
    {
        //Index 1 in the array is the captured group if it exists
        //Index 0 is the matched text, which we use if no captured group exists
        myArray.push(match[1] ? match[1] : match[0]);
    }
} while (match != null);

myArray теперь будет содержать именно то, что запрашивал OP:

single,words,fixed string of words
12 голосов
/ 12 мая 2010

Используется сочетание разделения и соответствия регулярному выражению.

var str = 'single words "fixed string of words"';
var matches = /".+?"/.exec(str);
str = str.replace(/".+?"/, "").replace(/^\s+|\s+$/g, "");
var astr = str.split(" ");
if (matches) {
    for (var i = 0; i < matches.length; i++) {
        astr.push(matches[i].replace(/"/g, ""));
    }
}

Возвращает ожидаемый результат, хотя одно регулярное выражение должно быть в состоянии выполнить все это.

// ["single", "words", "fixed string of words"]

Обновление И это улучшенная версия метода, предложенного S.Mark

var str = 'single words "fixed string of words"';
var aStr = str.match(/\w+|"[^"]+"/g), i = aStr.length;
while(i--){
    aStr[i] = aStr[i].replace(/"/g,"");
}
// ["single", "words", "fixed string of words"]
3 голосов
/ 02 июля 2014

Здесь может быть полное решение: https://github.com/elgs/splitargs

2 голосов
/ 26 октября 2017

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

  • Разделить пробелом, кроме внутренних кавычек
  • Удаление кавычек, но не для кавычек с обратной косой чертой
  • Побег цитата становится цитатой
  • Можно ставить цитаты в любом месте

Код:

str.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

Выход:

[ 'single', 'words', 'fixed string of words' ]
0 голосов
/ 13 мая 2019

Это решение будет работать как для двойных ("), так и для одинарных (') кавычек:

Код :

str.match(/[^\s"']+|"([^"]*)"/gmi)

// ["single", "words", "fixed string of words"]

Здесь показано, как это регулярное выражениебудет работать: https://regex101.com/r/qa3KxQ/2

0 голосов
/ 01 марта 2019

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

const parseWords = (words = '') =>
    (words.match(/[^\s"]+|"([^"]*)"/gi) || []).map((word) => 
        word.replace(/^"(.+(?="$))"$/, '$1'))
0 голосов
/ 30 декабря 2012

Я также заметил исчезающие символы. Я думаю, что вы можете включить их - например, чтобы оно включало «+» со словом, используйте что-то вроде «[\ w \ +]» вместо просто «\ w».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...