Разбиение пространства избегая двойные кавычки в JS строки: у '"б \" с" д ' В ['А','"Б \" С"','Д']
В настоящее время я создаю небольшой текстовый редактор для пользовательского формата файла. У меня есть графический интерфейс, но я также реализовал небольшую консоль вывода. Чего я хочу добиться, так это добавить очень простое поле ввода для выполнения некоторых команд и передачи параметров.
Команда будет выглядеть так:
compile test.json output.bin -location "Paris, France" -author "Charles "Demurgos""
Моя задача состоит в том, чтобы получить массив, содержащий разделенные пробелами аргументы, но сохраняющий части в двойных кавычках, которые могут быть строкой, сгенерированной JSON.stringify, содержащей экранированные двойные кавычки внутри.
Чтобы было понятно, ожидаемый массив для предыдущей команды:
[
'compile',
'test.json',
'output.bin',
'-location',
'"Paris, France"',
'-author',
'"Charles \"Demurgos\""'
]
Затем я могу перебрать этот массив и применить JSON.parse if indexOf('"') == 0, чтобы получить конечный результат:
[
'compile',
'test.json',
'output.bin',
'-location',
'Paris, France',
'-author',
'Charles "Demurgos"'
]
Благодаря этому вопросу: разделите строку запятыми, но игнорируйте запятые в двойных кавычках с помощью Javascript. Я смог получить то, что мне нужно, если аргументы не содержат двойных кавычек. Вот регулярное выражение, которое я получил:
/(".*?"|[^"s]+)(?=s*|s*$)/g
Но он выходит из текущего параметра когда он сталкивается с двойной цитатой, даже если она экранирована. Как я могу адаптировать это регулярное выражение, чтобы заботиться о сбежавших или не двойных кавычках ? А как насчет крайних случаев, если я подскажу action "windowsDirectory\" otherArg, здесь обратная косая черта уже экранирована, поэтому, даже если за ней следует двойная кавычка, она должна выйти из аргумента.
Этой проблемы я старался избегать как можно дольше во время предыдущих проектов, но я чувствую, что пришло время для меня, чтобы научиться правильно принимать во внимание escape-символы.
Здесь есть JS-Скрипка: http://jsfiddle.net/GwY8Y/1/
Вы можете видеть, что начало хорошо проанализировано, но последние аргументы разбиты и ошибки.
Спасибо за любую помощь.
1 ответ:
Это регулярное выражение даст вам нужные строки (см. демонстрацию ):
"(?:\\"|\\\\|[^"])*"|\S+Используйте его следующим образом:
your_array = subject.match(/"(?:\\"|\\\\|[^"])*"|\S+/g);Объясните Регулярное Выражение
" # '"' (?: # group, but do not capture (0 or more times # (matching the most amount possible)): \\ # '\' " # '"' | # OR \\\\ # two backslashes | # OR [^"] # any character except: '"' )* # end of grouping " # '"' | # OR \S+ # non-whitespace (all but \n, \r, \t, \f, # and " ") (1 or more times (matching the # most amount possible))
Comments