Что различные методы должны проанализировать строки в Java? [закрытый]

Оба правильные, но они интерпретируются как даты с двумя разными часовыми поясами. Итак, вы сравнили яблоки и апельсины:

// local dates
new Date("Jul 8, 2005").toISOString()            // "2005-07-08T07:00:00.000Z"
new Date("2005-07-08T00:00-07:00").toISOString() // "2005-07-08T07:00:00.000Z"
// UTC dates
new Date("Jul 8, 2005 UTC").toISOString()        // "2005-07-08T00:00:00.000Z"
new Date("2005-07-08").toISOString()             // "2005-07-08T00:00:00.000Z"

Я удалил вызов Date.parse(), так как он автоматически используется для строкового аргумента. Я также сравнивал даты с использованием формата ISO8601 , чтобы вы могли визуально сравнивать даты между вашими местными датами и датами UTC. Время разговора составляет 7 часов, что является разницей в часовом поясе и почему ваши тесты показывают две разные даты.

Другим способом создания этих же локальных / UTC-дат будет:

new Date(2005, 7-1, 8)           // "2005-07-08T07:00:00.000Z"
new Date(Date.UTC(2005, 7-1, 8)) // "2005-07-08T00:00:00.000Z"

Но я по-прежнему настоятельно рекомендую Moment.js , который как простой, но мощный :

// parse string
moment("2005-07-08").format()       // "2005-07-08T00:00:00+02:00"
moment.utc("2005-07-08").format()   // "2005-07-08T00:00:00Z"
// year, month, day, etc.
moment([2005, 7-1, 8]).format()     // "2005-07-08T00:00:00+02:00"
moment.utc([2005, 7-1, 8]).format() // "2005-07-08T00:00:00Z"

48
задан agweber 13 May 2014 в 06:34
поделиться

13 ответов

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

  1. Read в строке
    • Разделение строка в маркеры
    • Использование словарь для преобразования синонимов в стандартную форму
    • , Например, преобразуйте "хит", "перфорацию", "забастовку", и "ударьте", все для "совершения нападки"
    • Выполняют действия с незаказанным, включительно базируются
    • Незаказанный - "перфорация, обезьяна в поверхности" является тем же самым как "поверхность в перфорации обезьяны"
    • Содержащий - Если команда, как предполагается, является "перфорацией обезьяна в поверхности", и они предоставляют "обезьяну перфорации", необходимо проверить, какому количеству команд это соответствует. Если только одна команда, сделайте это действие. Это могла бы даже быть хорошая идея иметь приоритеты команды, и даже если бы были даже соответствия, это выполнило бы главное действие.
15
ответ дан andrewrk 7 November 2019 в 12:33
поделиться

Если язык очень прост как всего

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

тогда разделение ручными работами хорошо.

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

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

1
ответ дан Scott Stanchfield 7 November 2019 в 12:33
поделиться

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

StringTokenizer

, но когда разделитель варьируется или является сложным y, рекомендует Вам использовать регулярные выражения, которые могут использоваться самим Строковым классом, разделением метода, с тех пор 1.4. Это использует класс Шаблона от java.util.regex пакета

Шаблон

1
ответ дан Telcontar 7 November 2019 в 12:33
поделиться

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

Вот пример с помощью токенизатора:

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

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

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

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

1
ответ дан Mike Stone 7 November 2019 в 12:33
поделиться

@CodingTheWheel Здесь является Вашим кодом, небольшой уборкой и через затмение ( ctrl + сдвиг + 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;
}
2
ответ дан Valery Viktorovsky 7 November 2019 в 12:33
поделиться

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

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

4
ответ дан SaM 7 November 2019 в 12:33
поделиться

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

6
ответ дан John with waffle 7 November 2019 в 12:33
поделиться

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

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

6
ответ дан bpapa 7 November 2019 в 12:33
поделиться

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

    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.

...

7
ответ дан Justin Standard 7 November 2019 в 12:33
поделиться

Парсинг вручную является большой забавой... вначале:)

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

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

13
ответ дан Matt Ball 7 November 2019 в 12:33
поделиться

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

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

19
ответ дан Code Lღver 7 November 2019 в 12:33
поделиться

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

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

4
ответ дан Magnilex 7 November 2019 в 12:33
поделиться

JCommander кажется неплохим, хотя мне еще предстоит Попробуй это.

1
ответ дан 7 November 2019 в 12:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: