Разбиение пространства избегая двойные кавычки в 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/
Вы можете видеть, что начало хорошо проанализировано, но последние аргументы разбиты и ошибки.



Спасибо за любую помощь.

637   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

    Ничего не найдено.