Самый простой способ разбить строку на ключ / значение - PullRequest
2 голосов
/ 11 декабря 2008

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

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

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

Ответы [ 4 ]

4 голосов
/ 11 декабря 2008

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

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;
   }
}
3 голосов
/ 11 декабря 2008
/^(\"[^"]*\"|.*?)=(\"[^"]*\"|.*?)$/
2 голосов
/ 11 декабря 2008

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

/ ^               # 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 декабря 2008

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...