Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

  • Чтение в строке
    • Разделите строку на токены
    • Используйте словарь для преобразования синонимов в общую форму
    • Например, конвертировать "hit", "punch", "strike" и "kick" all to "hit"
    • Выполнение действий на неупорядоченной, включающей основе
    • Неупорядоченный - "удар обезьяной в лицо" - это то же самое, что "лицо в обезьянном ударе"
    • Inclusive. Если предполагается, что команда "пробивает обезьяну в лицо", и они поставляют "обезьяну-пунш", вы должны проверить, сколько команд это соответствует. Если только одна команда, выполните это действие. Возможно, было бы неплохо иметь командные приоритеты, и даже если бы были даже совпадения, он выполнил бы верхнее действие.

Ответ 2

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

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

Ответ 3

Анализ вручную - это очень весело... в начале:)

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

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

Ответ 4

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

    public static boolean simpleNLP( String inputline, String keywords[])
    {
        int i;
        int maxToken = keywords.length;
        int to,from;
        if( inputline.length() = inputline.length()) return false; // check for blank and empty lines
        while( to >=0 )
        {
            to = inputline.indexOf(' ',from);
            if( to > 0){
                lexed.addElement(inputline.substring(from,to));
                from = to;
                while( inputline.charAt(from) == ' '
                && from = keywords.length) { status = true; break;}
            }
        }
        return status;
    }

...

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

...

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

Попробуйте JavaCC генератор парсера для Java.

Он имеет множество функций для интерпретации языков и хорошо поддерживается в Eclipse.

Ответ 9

@CodingTheWheel Вот ваш код, немного очищенный и через затмение (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;
}

Ответ 10

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

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

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

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

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

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

Ответ 11

Когда разделителем String для команды всегда является одна и та же строка или char (например, ";" ), вы рекомендуете использовать класс StrinkTokenizer:

StringTokenizer

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

Pattern

Ответ 12

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

VERB NOUN

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

Если это сложнее, вы должны действительно изучить инструмент ANTLR или JavaCC.

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

Ответ 13

JCommander кажется довольно хорошим, хотя мне еще предстоит его проверить.

Ответ 14

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

Ответ 15

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

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

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

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