Я хочу разбить строку, любую строку, на массив пробелами, предпочтительно с помощью метода split()
. Однако я хочу игнорировать пробелы в кавычках.
Возьмем, например:
'word "words in double quotes"'
Он должен стать массивом с:
[
'word',
'words in double quotes'
]
Я посмотрел на подобные ответы на это, и они обычно приводили массив:
[
'word',
'"words in double quotes"'
]
и это не то, что я ищу. Я не хочу, чтобы кавычки добавлены в элемент массива.
Какое регулярное выражение я могу использовать?
Я не думаю, что то, что вы хотите, может быть достигнуто за счет использования только 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
: Глобальный флаг - команда для соответствия всем вхождениям.word "words with double quotes"
в качестве примера. Регулярное выражение должно работать с любой строкой, такой как command arg1 "arg 2" arg3
или apples bananas "apples and bananas"
Я исправил формулировку в посте, чтобы устранить любую путаницу.
использование regexp резко влияет на читаемость и ремонтопригодность вашего кода. особенно когда вы пытаетесь решить проблему существующих ограничений (скажем, не хватает внешнего вида).
Надеюсь, это то, что вы ищете:
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);
split
какsplit
не может удалить конечную кавычку без, хорошо представляя еще один сплит. Попробуйте, например,const [match, first, second] = string.match(/^(.*) "(.*)"$/)
'word "words in double quotes"'.split(/"(.*?)"|\s+/g).filter(Boolean)
, но зависит от того, как экранируются кавычки в кавычках