Поиск большой строки, чтобы увидеть, существует ли недопустимый «параметр» - PullRequest
1 голос
/ 06 мая 2009

У меня есть большая строка, похожая на эту:

BREW горшок HTCPCP / 1.0

Принять-дополнения: # молоко; 3 # виски; всплеск

Длина содержимого: 5

Тип контента: сообщение / кофейник

У меня также есть массив с несколькими дополнениями (#whiskey, #espresso и т. Д.). Что мне нужно сделать, это отправить ошибку, если эта большая строка содержит дополнение, которого нет в массиве доступных дополнений. Например, если часть строки «Accept-Additions» содержала «#bricks; 3», то возникла ошибка, поскольку ее нет в массиве.

Как бы я поступил по этому поводу на Java? У меня возникли проблемы с реализацией этой части, хотя я закодировал остальную часть программы (которую многие из вас могут узнать). Как бы я кодировал следующую проблему с акцентом на недоступность дополнения?

Ответы [ 3 ]

1 голос
/ 06 мая 2009

Этот код делает несколько предположений о вводе. Похоже, вы можете разбить каждый токен еще дальше на #; компоненты. Использование List для вашего приемлемого параметра liquids немного очистит код (просто используйте liquids.contains (String s))

  static String[] liquids = {"#milk;3", "#whiskey;splash"};

  public static void parseString(String input)
  {
    // Break the String down into line-by-line.
    String[] lines = input.split("" + '\n');
    for (int line_index = 0; line_index < lines.length; line_index++)
    {
      if (lines[line_index].length() > 16)
      {
        // Assume you're delimiting by '#'
        String[] tokens = lines[line_index].split("#");
        if (tokens.length > 1)
        {
          // Start at index = 1 to kill "Accept-Additions:"
          for (int token_index = 1; token_index < tokens.length; token_index++)
          {
            boolean valid = false;
            for (int liquids_index = 0; liquids_index < liquids.length; liquids_index++)
            {
              if (liquids[liquids_index].equals("#" + tokens[token_index]))
              {
                valid = true;
                // break to save some time if liquids is very long
                break;
              }
            }
            if (!valid)
            {
              throwError("#" + tokens[token_index]);
            }
          }
        }
      }
    }
  }

  public static void throwError(String error)
  {
    System.out.println(error + " is not in the Array!");
  }
1 голос
/ 06 мая 2009

Вы бы проанализировали строку. Глядя на это, вы получаете один набор опций для каждой строки, поэтому вы можете искать все строки, которые начинаются с ACCEPT-ADDITIONS. Затем вы должны извлечь дополнения, которые кажутся разделенными точками с запятой, указывая String.split (). Затем выполните итерацию по массиву соответствия, чтобы найти дополнения.

Или вы можете создать грамматику и использовать такой инструмент, как ANTLR, для генерации вашего синтаксического анализатора.

0 голосов
/ 06 мая 2009

Вот возможное решение с использованием регулярных выражений. Он извлекает строку «Принять-дополнения» из полезной нагрузки, а затем проверяет каждую пару ключ-значение в форме #foo;bar.

final String[] VALID_ADDITIONS = { 
    "milk", "whiskey"
};

final Pattern LINE = Pattern.compile("Accept-Additions:(.+)$", Pattern.MULTILINE);
final Pattern ADDITIONS = Pattern.compile("#(.+?);([^#]+)");

void checkValidAdditions(String request) {
    Matcher lineMatcher = LINE.matcher(request);
    if (!lineMatcher.find()) {
        // no additions - do whatever is appropriate here
        throw new IllegalArgumentException("Additions line not found");
    }
    String line = lineMatcher.group(1);
    Matcher additions = ADDITIONS.matcher(line);
    while (additions.find()) {
        String key = additions.group(1);
        //String value = additions.group(2);

        boolean validKey = false;
        for (String validAddition : VALID_ADDITIONS) {
            if (key.equals(validAddition)) {
                validKey = true;
            }
        }
        if (!validKey) {
            // ...
        }
    }
}

Первое регулярное выражение извлекает соответствующую строку из запроса. Второй извлекает пары ключ-значение. Обратите внимание на следующие предостережения:

  • Этот метод не будет правильно отбирать некорректные запросы - только недействительные «ключи».

  • Если вы разрешаете использовать другую заглавную букву (например, «ПРИНЯТЬ-ДОБАВИТЬ», «принять-дополнения»), добавьте флаг Pattern.CASE_INSENSITIVE, т.е.

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