Делаю калькулятор. Дело дошло до разбиения на "слова". И вот хочу применить 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
)
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
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
В строке "qwerty [5] uiopp (6) asdf (1) hjkl; [3]" нужно найти и заменить все "[N]" на "RN", а "(N)" на "XN", где N- любая цифраЧерез regex я что-то не осилил, из-за скобок