HTTP запрос парсер путь


Я написал метод для маркировки HTTP-запрос пути, такие как /сотрудника/23/редактировать:

protected void compile(String path){
    int mark=0;
    for(int i=0; i<path.length(); ++i){
        if(path.charAt(i)==DELIM){
            if(mark!=i)
                tokens.add(path.substring(mark,i));
            mark=i+1;
        }
        else if(path.length()==i+1){
            tokens.add(path.substring(mark,i+1));
        }
    }
}

И способ маркировки потребительской этих путей, таких как /работника/[идентификатор]/редактирования:

protected void compile(String path){
    int mark=0;
    boolean wild=false;
    for(int i=0; i<path.length(); ++i){
        if(!wild){
            if(path.charAt(i)==DELIM){
                if(mark!=i)
                    tokens.add(path.substring(mark,i));
                mark=i+1;
            }
            else if(path.length()==i+1){
                tokens.add(path.substring(mark,i+1));
            }
            else if(path.charAt(i)=='['){
                wild=true;
            }
        }
        else if(path.charAt(i)==']'){
            tokens.add("?");
            wild=false;
            mark=i+1;
        }
    }
}

Идея здесь заключается в том, что там будет неявную переменную идентификатор со значением 23. Однако, это не здесь, ни там. Каким образом мой подход искать? Его можно улучшить? Также: делим = '/'.

Это более-или-менее упражнение в написании парсера, который является, почему я не использовать строку#сплит().



782
12
задан 20 января 2011 в 06:01 Источник Поделиться
Комментарии
2 ответа

Ваш первый скомпилировать метод можно заменить на один вызов строки.сплит.

Предполагая обычное поведение для второй компиляции метода такова, что "с именем/foo/Б[А]Р/баз" будет составлять до {"фу", "?", "баз"}, его можно заменить на призыв к расколу , а затем переберем результат и заменить любую строку в квадратные скобки с "?".

Если целевое поведение, а что он будет компилироваться в {"фу", "б", "?", "Р", "баз"}, вы можете сначала заменить [что-нибудь] на /?/ используя строку.замену и затем использовать строку.сплит.

11
ответ дан 20 января 2011 в 06:01 Источник Поделиться

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

Также, я предполагаю, что вы собираетесь в конечном итоге обрабатывать url С "?" и такие в них. Вы можете рассмотреть возможность проверки на недопустимые символы в URL, так что вы знаете, когда вы попали в конец пути фактического запроса.

4
ответ дан 20 января 2011 в 07:01 Источник Поделиться