Каковы различные методы разбора строки в Java?

голоса
43

Для разбора команд игроков, я чаще использовал раздвоение методы для разбиения строки на разделителях , а затем затем просто выяснить , остальное рядом ifс или switchэс. Какие разные способы разбора строки в Java?

Задан 06/08/2008 в 00:49
источник пользователем
На других языках...                            


15 ответов

голоса
19

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

Я хотел бы предложить вам проверить http://www.regular-expressions.info для хорошего интро регулярных выражений, а также конкретные примеры для Java.

Ответил 06/08/2008 d 00:54
источник пользователем

голоса
14

Я предполагаю, что вы пытаетесь сделать интерфейс командной прощает, насколько это возможно. Если это так, то я предлагаю вам использовать алгоритм, аналогичный этому:

  1. Читайте в строке
    • Разделить строку на лексемы
    • Используйте словарь для преобразования синонимы к общей форме
    • Например, конвертировать «хит», «удар», «удар» и «удар» все в «хит»
    • Выполните действия по неупорядоченным, включительно базам
    • Unordered - «удар обезьяны в лицо» это то же самое , как «лицо в обезьяннике удар»
    • Inclusive - Если команда должна быть «удар обезьяны в лицо» , и они поставляют «удар обезьяны», вы должны проверить , сколько команд это соответствует. Если только одну команду, сделать это действие. Это может быть даже хорошая идея , чтобы иметь приоритеты команды, и даже если там были даже спички, она будет выполнять первое действие.
Ответил 06/08/2008 d 01:42
источник пользователем

голоса
13

Синтаксический вручную будет очень весело ... в начале :)

На практике , если команды не очень сложные вы можете относиться к ним так же, как те , которые используются в командной строки переводчиков. Там есть список библиотек , которые вы можете использовать: http://java-source.net/open-source/command-line . Я думаю , что вы можете начать с Apache Commons CLI или args4j (использует аннотацию). Они хорошо документированы и очень проста в использовании. Они ручка разбора автоматически и единственное , что вам нужно сделать , это прочитать определенные поля в объекте.

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

Ответил 30/08/2008 d 23:26
источник пользователем

голоса
7

Я хотел бы посмотреть на Java миграции в Zork , и склоняюсь к простому Natural Language Processor (ведомому либо tokenizing или регулярному выражением) , например, следующее (по этой ссылке):

    публичный статический логический simpleNLP (String inputline, Струнные ключевые слова [])
    {
        Int я;
        INT maxToken = keywords.length;
        Int, от них;
        если (inputline.length () = inputline.length ()) возвращает ложь; // проверка на пустые и пустые строки
        в то время как (с> = 0)
        {
            к = inputline.indexOf (»», из);
            если (к> 0) {
                lexed.addElement (inputline.substring (от, до));
                от = с;
                в то время как (inputline.charAt (с) == ''
                && от = keywords.length) {статус = TRUE; ломать;}
            }
        }
        вернуть статус;
    }

...

Все, что дает программисту основание смотреть на Zork снова хорошо в моей книге, просто следить за Grues.

...

Ответил 06/08/2008 d 01:16
источник пользователем

голоса
6

Еще один голос за Antlr / ANTLRWorks. Если создать две версию файла, один с кодом Java на самом деле выполнения команд, и один без (только с грамматикой), то у вас есть исполняемые спецификации языка, который отлично подходит для тестирования, благо для документации и большая экономия время, если вы когда-нибудь решите портировать его.

Ответил 31/08/2008 d 02:38
источник пользователем

голоса
6

Сам ВС рекомендует держаться подальше от StringTokenizer и используя метод String.spilt вместо этого.

Вы также можете посмотреть на класс Pattern.

Ответил 06/08/2008 d 17:14
источник пользователем

голоса
4

Попробуйте JavaCC генератор синтаксических анализаторов для Java.

Она имеет много возможностей для интерпретации языков, и это очень хорошо поддерживается на Eclipse.

Ответил 31/08/2008 d 20:45
источник пользователем

голоса
4

Если это разобрать командную строку , я предложил бы использовать Commons Cli .

Библиотека Apache Commons CLI предоставляет API для обработки интерфейсов командной строки.

Ответил 31/08/2008 d 02:05
источник пользователем

голоса
2

@CodingTheWheel Heres ваш код, немного очистить и через затмения ( ctrl+ shift+ f) и вставить обратно сюда :)

В том числе четыре пробела перед каждой строкой.

public static boolean simpleNLP(String inputline, String keywords[]) {
    if (inputline.length() < 1)
        return false;

    List<String> lexed = new ArrayList<String>(); 
    for (String ele : inputline.split(" ")) {
        lexed.add(ele);
    }


    boolean status = false;
    to = 0;
    for (i = 0; i < lexed.size(); i++) {
        String s = (String) lexed.get(i);
        if (s.equalsIgnoreCase(keywords[to])) {
            to++;
            if (to >= keywords.length) {
                status = true;
                break;
            }
        }
    }
    return status;
}
Ответил 06/08/2008 d 16:18
источник пользователем

голоса
1

сплит метод может разбить строку в массив указанного выражения подстроки regex. Его аргументы в двух формах, а именно: сплит ( String regex) и сплит ( String regex, int limit), которые разделены ( String regex) на самом деле, вызвав раскол (String регулярное выражение, внутр предел) для достижения, предел 0 . Тогда, когда предел> 0 и предел <0 означает , что?

Когда JDK объяснено: когда предел> 0 суб-массива длиной до предела, то есть, если это возможно, может быть предел-1 подразбиение, оставаясь в качестве подстроки ( за исключением предела-1 раз персонаж строка разделена конец) ;

Предел <0 указывает на отсутствие ограничения на длину массива;

предел = 0 конца строки пустой строки будет усечен. StringTokenizerкласс по соображениям совместимости и сохраняется устаревший класс, поэтому мы должны попытаться использовать метод разделения класса String. см ссылку

Ответил 13/05/2014 d 15:13
источник пользователем

голоса
1

Если текст содержит несколько разделителей , то вы можете использовать splitметод.
Если текст содержит неправильные строки означает другой формат в нем , то вы должны использовать regular expressions.

Ответил 24/11/2012 d 10:17
источник пользователем

голоса
1

JCommander кажется довольно хорошо, хотя я до сих пор , чтобы проверить это.

Ответил 20/08/2010 d 14:59
источник пользователем

голоса
1

Если язык мертвый простой, как только

ГЛАГОЛ СУЩЕСТВИТЕЛЬНОЕ

то расщепление вручную работает хорошо.

Если это более сложная, вы должны реально смотреть на инструмент, как ANTLR или JavaCC.

У меня есть учебник по ANTLR (v2) в http://javadude.com/articles/antlrtut , который даст вам представление о том , как она работает.

Ответил 16/09/2008 d 16:35
источник пользователем

голоса
1

Когда разделитель строки для команды всегда находится та же строка или символ (как «;») у рекомендую вам использовать класс StrinkTokenizer:

StringTokenizer

но когда сепаратор изменяется или комплекс у рекомендуем Вам использовать регулярные как выражения, которым может быть использована сама строка класса, метод разделения, начиная с 1.4. Он использует класс шаблона из пакета java.util.regex

Шаблон

Ответил 06/08/2008 d 16:40
источник пользователем

голоса
1

Простая строка токенизаторы на пространствах должны работать, но есть очень много способов, вы можете сделать это.

Ниже приведен пример использования токенизатор:

String command = "kick person";
StringTokenizer tokens = new StringTokenizer(command);
String action = null;

if (tokens.hasMoreTokens()) {
    action = tokens.nextToken();
}

if (action != null) {
    doCommand(action, tokens);
}

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

Ответил 06/08/2008 d 00:57
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more