Разделить строку пробелами, но игнорировать пробелы в кавычках

1

Я хочу разбить строку, любую строку, на массив пробелами, предпочтительно с помощью метода split(). Однако я хочу игнорировать пробелы в кавычках.

Возьмем, например:

'word "words in double quotes"'

Он должен стать массивом с:

[
  'word',
  'words in double quotes'
]

Я посмотрел на подобные ответы на это, и они обычно приводили массив:

[
  'word',
  '"words in double quotes"'
]

и это не то, что я ищу. Я не хочу, чтобы кавычки добавлены в элемент массива.

Какое регулярное выражение я могу использовать?

  • 2
    это невозможно с помощью одного split как split не может удалить конечную кавычку без, хорошо представляя еще один сплит. Попробуйте, например, const [match, first, second] = string.match(/^(.*) "(.*)"$/)
  • 0
    может быть 'word "words in double quotes"'.split(/"(.*?)"|\s+/g).filter(Boolean) , но зависит от того, как экранируются кавычки в кавычках
Теги:

3 ответа

0
Лучший ответ

Я не думаю, что то, что вы хотите, может быть достигнуто за счет использования только String.prototype.split, поскольку его использование, скорее всего, приведет к пустым строкам в результирующем массиве; и о том, что вы дали. Если вам нужно общее решение вашей проблемы, я считаю, что split не будет работать вообще.

Если ваша цель - создать тот же результат независимо от фактической строки, я бы предложил вам использовать комбинацию String.prototype.match, [].map и String.prototype.replace как показано:

Код:

var
  /* The string. */
  string = 'apples bananas "apples and bananas" pears "apples and bananas and pears"',

  /* The regular expression. */
  regex = /"[^"]+"|[^\s]+/g,

  /* Use 'map' and 'replace' to discard the surrounding quotation marks. */
  result = string.match(regex).map(e => e.replace(/"(.+)"/, "$1"));
  
console.log(result);

Объяснение используемого регулярного выражения:

  • "[^"]+": Захват любой последовательности символов (не менее 1) внутри двух кавычек, кроме кавычки.
  • | : Логическое ИЛИ.
  • [^\s]+: Захват любой последовательности символов без пробелов (не менее 1).
  • g: Глобальный флаг - команда для соответствия всем вхождениям.
  • 0
    Извините, я имел в виду строку word "words with double quotes" в качестве примера. Регулярное выражение должно работать с любой строкой, такой как command arg1 "arg 2" arg3 или apples bananas "apples and bananas" Я исправил формулировку в посте, чтобы устранить любую путаницу.
  • 0
    Спасибо за вашу помощь! @ Ангел Политис
Показать ещё 1 комментарий
0
  1. разбить начальную строку на "
  2. разбивать каждый нечетный элемент в результате # 1 пробелом

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

-1

Надеюсь, это то, что вы ищете:

var words = 'word "words in double quotes" more text "stuff in quotes"';
var wordArray = words.match(/"([^"]+)"|[^" ]+/g);
for(var i=0,l=wordArray.length; i<l; i++){
  wordArray[i] = wordArray[i].replace(/^"|"$/g, '');
}
console.log(wordArray);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню