Самый простой способ разбить строку на ключ / значение

Каков наилучший способ извлечь ключ и значение из строки, подобной этой:

var myString = 'A1234=B1234';

У меня изначально было что-то вроде этого:

myString.split('=');

И это прекрасно работает, НО знак равенства (=) может использоваться в качестве ключа или значения в строке плюс строка может иметь кавычки, например так:

var myString = '"A123=1=2=3=4"="B1234"';

Строка также может содержать только одну пару кавычек и пробелов:

var myString = ' "A123=1=2=3=4" = B1234 ';

Я не очень хорош в регулярных выражениях, но я предполагаю, что это путь вперед?

В итоге я хочу получить две переменные, ключ и значение, в приведенном выше случае ключевая переменная будет иметь вид A123 = 1 = 2 = 3 = 4, а переменная-значение будет B1234 .

Если значение отсутствует, например, если это была исходная строка:

var myString = 'A1234';

Тогда я бы хотел, чтобы переменная ключа была «A1234», а переменная-значение была бы нулевой или ложной - или что-то, с чем я мог бы проверить.

Любая помощь приветствуется.

11.12.2008 01:18:59
Вы уверены, что хотите разрешить = как допустимый символ в ключе или значении?
David Koelle 11.12.2008 01:27:32
Слабое отношение к: stackoverflow.com/questions/328387/…
strager 11.12.2008 01:45:35
4 ОТВЕТА
РЕШЕНИЕ

То , что я , как правило, делать в файлах конфигурации , это убедиться , что нет не исключено , что символ - разделитель может попасть в любой ключ или значение.

Иногда это легко, если вы можете просто сказать «нет» = «разрешены символы», но мне пришлось прибегнуть к кодированию этих символов в некоторых местах.

Я обычно делаю их в шестнадцатеричном формате, чтобы, если вам нужен символ '=', вам пришлось бы вводить% 3d (и% 25 для символа '%', чтобы вы не думали, что это шестнадцатеричный символ). Вы также можете использовать% xx для любого символа, но это требуется только для этих двух.

Таким образом, вы можете проверить строку, чтобы убедиться, что она имеет один и только один символ '=', а затем постобработать ключ и значение, чтобы превратить шестнадцатеричные символы обратно в реальные.

2
11.12.2008 01:32:57
Вы правы - слишком много хлопот, чтобы угодить людям, которые захотят использовать знак равенства. В итоге я просто использовал разделенную вещь - в будущем я мог бы придумать что-нибудь с юникодом. Спасибо за совет! :)
James 11.12.2008 01:48:27

не могу помочь с однострочником, но я предложу наивный способ:

var inQuote = false;
for(i=0; i<str.length; i++) {
   if (str.charAt(i) == '"') {
      inQuote = !inQuote;
   }
   if (!inQuote && str.charAt(i)=='=') {
      key = str.slice(0,i);
      value = str.slice(i+1);
      break;
   }
}
4
11.12.2008 18:14:46
Не забывайте обратную косую черту для экранирования кавычек! Но это почти такой же подход, как и я. Регулярные выражения не являются правильным инструментом здесь. Это работа для парсера.
benjismith 11.12.2008 01:39:18
Спасибо за это, я сохранил его на будущее - для этой конкретной проблемы я просто проигнорирую эти знаки равенства и, подумав об этом, пользователю не нужно будет иметь возможность включать кавычки. - Я раздену их при входе пользователя.
James 11.12.2008 01:49:48
В Internet Explorer вы не можете использовать str [x], но можете использовать str.charCode (x)
some 11.12.2008 02:07:51
Чертовски глупые браузерные несовместимости :-) - вот почему я люблю jQuery со страстью.
paxdiablo 11.12.2008 02:13:54
хороший звонок @ кое-что ... Я на самом деле задал SO вопрос о IE и str [x] раньше, но я все забываю :)
Jimmy 11.12.2008 18:14:22
/^(\"[^"]*\"|.*?)=(\"[^"]*\"|.*?)$/
3
11.12.2008 07:41:23
Положите $ в конце этого, в противном случае ленивый сопоставитель соответствует своему имени и ничего не соответствует.
nickf 11.12.2008 03:21:32

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

/ ^               # Beginning of line
  \s*             # Any number of spaces
  ( " ( [^"]+) "  # A quote followed by any number of non-quotes, 
                  # and a closing quote
  | [^=]*         # OR any number of not equals signs 
    [^ =]         # and at least one character that is not a equal or a space
  )               
  \s*             # any number of spaces between the key and the operator
  =               # the assignment operator
  \s*             # Any number of spaces 
  (.*?\S)         # Then any number of any characters, stopping at the last non-space
  \s*             # Before spaces and...
  $               # The end of line. 

/

Теперь в Java, в файлах свойств (они разбиваются на первые символы ':' или '='), вы можете иметь несколько строк в свойстве, поставив '\' в конце строки, так что это будет немного сложнее.

2
11.12.2008 06:50:19