StringTokenizer и RegEx

314
13 сентября 2017, 11:56

Делаю калькулятор. Дело дошло до разбиения на "слова". И вот хочу применить StringTokenizer или более современный аналог для разбиения выражения на слова с учётом определённого списка разделителей.

String delimeters = {"+", "-", "*", "/", "^", "==", "&&", "||", " "}; //Разделитли
StringTokenizer st = new StringTokenizer("регулярное выражение сформированное из delimeters", true);
while (st.hasMoreTokens()) {
    tokens.add(st.nextToken());
}

Как вы заметили разделитель может состоять из нескольких символов.

Пример :

String delimeters[] = {"+", "-", "*", "/", "^", "&&", "||", "==", "(", ")"}    
List<String> separated = split("true||false==(false||true)", delimeters);
for (int i = 0; i < separated.length; i++)
    System.out.println(separated.get(i));

Должна напечатать :

true
||
false
==
(
false
||
true
)
Answer 1

https://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html

StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. It is recommended that anyone seeking this functionality use the split method of String or the java.util.regex package instead.

В вашем случае более правильным будет использовать простой проход по строке (ну или можно заморочиться реализацией конечного автомата)

На скорую руку

public class Tokenizer {
    private List<String> tokens       = new ArrayList<>();
    private String       currentToken = "";
    public List<String> tokenize() {
        String      inputString = "true||false==(false||true)";
        Set<String> delimiters  = new HashSet<>(Arrays.asList("+", "-", "*", "/", "^", " ", "(", ")", "==", "&&", "||"));
        int length = inputString.length();
        for (int i = 0; i < length; i++) {
            String one = inputString.substring(i, i + 1);
            String two = i < length - 1 ? inputString.substring(i, i + 2) : "fake delimiter";
            if (delimiters.contains(one)) {
                addTokens(one);
                continue;
            }
            if (delimiters.contains(two)) {
                addTokens(two);
                i++;
                continue;
            }
            currentToken += one;
        }
        if (!currentToken.equals("")) tokens.add(currentToken);
        return tokens;
    }
    private void addTokens(String delimiter) {
        if (!currentToken.equals("")) {
            tokens.add(currentToken);
        }
        tokens.add(delimiter);
        currentToken = "";
    }
}

ideone

READ ALSO
Цикл &ldquo;for&rdquo; Java

Цикл “for” Java

Всем привет, как создать на вот этот код цикл? Я пробовал по такому типу

202
Поиск и замена подстрок &ldquo;[N]&rdquo; и &ldquo;(N)&rdquo; в строке

Поиск и замена подстрок “[N]” и “(N)” в строке

В строке "qwerty [5] uiopp (6) asdf (1) hjkl; [3]" нужно найти и заменить все "[N]" на "RN", а "(N)" на "XN", где N- любая цифраЧерез regex я что-то не осилил, из-за скобок

280