Другое решение кандидата с использованием регулярного выражения. Сохраняет порядок токенов, правильно соответствует нескольким токенам одного типа в строке. Недостатком является то, что регулярное выражение является довольно неприятным.
package javaapplication2;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class JavaApplication2 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
String num = "58.5+variable-+98*78/96+a/78.7-3443*12-3";
// Terrifying regex:
// (a)|(b)|(c) match a or b or c
// where
// (a) is one or more digits optionally followed by a decimal point
// followed by one or more digits: (\d+(\.\d+)?)
// (b) is one of the set + * / - occurring once: ([+*/-])
// (c) is a sequence of one or more lowercase latin letter: ([a-z]+)
Pattern tokenPattern = Pattern.compile("(\\d+(\\.\\d+)?)|([+*/-])|([a-z]+)");
Matcher tokenMatcher = tokenPattern.matcher(num);
List<String> tokens = new ArrayList<>();
while (!tokenMatcher.hitEnd()) {
if (tokenMatcher.find()) {
tokens.add(tokenMatcher.group());
} else {
// report error
break;
}
}
System.out.println(tokens);
}
}
Образец вывода:
[58.5, +, variable, -, +, 98, *, 78, /, 96, +, a, /, 78.7, -, 3443, *, 12, -, 3]
Существует пара опций синтаксиса для работы с delete
как зарезервированным словом:
call
delete
в переменной с другим именем Обе опции показаны ниже.
Для связанных функций вы просто разделяете цепочку на отдельные вызовы и используете результат одного вызова для выполнения следующего вызова. Я включил пример выполнения цепных вызовов после двух delete
примеров.
import { call } from "redux-saga/effects";
const refResponse = {
remove: () => {
console.log("You removed me!");
}
};
const action = {
user: {
delete: () => {
console.log("You deleted me!");
}
}
};
const database = {
ref: () => {
console.log("Returning ref");
return refResponse;
}
};
export const starter = function*() {
console.log("before call");
yield call([action.user, "delete"]);
console.log("after call using string for function name");
const deleteFunc = action.user.delete;
yield call([action.user, deleteFunc]);
console.log("after call using function variable");
console.log("before start of chained call");
const result = yield call([database, "ref"]);
console.log("before 2nd part of chained call");
yield call([result, "remove"]);
};