разбор строки - PullRequest
       25

разбор строки

1 голос
/ 21 июня 2011

У меня есть строка, которая будет в формате

<!-- accountId="123" activity="add" request="add user" -->

Количество параметров и порядок случайный.запрос, мне нужно проанализировать текст добавления пользователя из строки.Каков наилучший способ сделать это на Java?

Ответы [ 7 ]

3 голосов
/ 21 июня 2011

Звучит как школьный проект, поэтому вместо решения проблемы я просто укажу вам правильное направление: ознакомьтесь с классом String Tokenizer

1 голос
/ 22 июня 2011

Вы можете проанализировать его с помощью регулярных выражений, что-то вроде этого:

public static Map<String, String> parse(String s) {
  Map<String, String> map = new HashMap<String, String>();
  Pattern p = Pattern.compile("(\\w+)\\s*=\\s*\"(.*?)\"");
  Matcher m = p.matcher(s);
  while (m.find()) {
    map.put(m.group(1), m.group(2));
  }
  return map;
}

С примером использования:

String s = "<!-- accountId=\"123\" activity=\"add\" request=\"add user\" -->";
Map<String, String> m = parse(s);
// m => {accountId=123, request=add user, activity=add}
m.get("request"); // => "add user"

Если вам нужно сохранить порядок атрибутов, которые вы можете использовать LinkedHashMap или TreeMap , например.

1 голос
/ 22 июня 2011

Мое решение было бы использовать грубую силу и разделить строку по мере необходимости, и обновить HashMap на основе этого. Это, вероятно, самое простое решение.

Другой способ - использовать String Tokenizer, как предложил Кайл.

Третий вариант - заменить начальную и конечную разметку, чтобы она сформировала правильный XML, а затем проанализировать ее как XML. Да, я знаю, что это как стрельба из мушки из пушки. Но иногда это может понадобиться и это вариант;)

0 голосов
/ 22 июня 2011

У меня больше всего опыта работы с регулярными выражениями Python, но синтаксис Java кажется таким же.Возможно, зачеркните '' с любого конца, затем переберите пары ключ-значение с помощью регулярного выражения, например

'\s?([\w ]+)="([\w ]+)"\s?(.*?)'

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

0 голосов
/ 22 июня 2011

Если вам просто нужно значение «request», самый быстрый способ сделать это будет:

void getRequest(String str) {
  int start = str.indexOf("request=\"");
  if (start != -1) {
     start += 9; // request="
     end = str.indexOf('"', start);
     if (end != -1) {
         return str.substring(start, end);
     }
  }
  // not found
  return null;
}
0 голосов
/ 22 июня 2011

Намек на простоту: не пытайтесь анализировать все за один раз. Например, сначала попробуйте получить необработанные пары ключ-значение, такие как 'activity = "add"'. Затем продолжайте оттуда.

0 голосов
/ 22 июня 2011

Вам необходимо выполнить следующие шаги:

  1. Найти подходящую последовательность символов для разделения на
  2. Перебрать возвращенный массив строк
  3. Когда текущий индексуказанного массива String соответствует ключу, который вы ищете, получить значение
...