Comments (4)
I have a working solution here.. it is not pretty but it works and also you need java 8 for this.
private static final Set<String> defaultVariables;
private static final Set<String> defaultOperators;
static {
TreeSet<String> defaults = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
Expression exp = new Expression("1+1");
defaults.addAll(exp.getDeclaredFunctions());
//defaults.addAll(exp.getDeclaredOperators());
defaults.addAll(exp.getDeclaredVariables());
defaultVariables = Collections.unmodifiableSet(defaults);
defaultOperators = exp.getDeclaredOperators();
}
public static Set<String> parseForVars(String formulaExpression) {
formulaExpression = replaceFunctions(formulaExpression, defaultVariables);
formulaExpression = replaceOperators(formulaExpression, defaultOperators);
log.debug("transformed {}", formulaExpression);
formulaExpression = formulaExpression.replace('(', ',');
formulaExpression = formulaExpression.replace(')', ',');
formulaExpression = formulaExpression.replaceAll("\\s+", ",");
log.debug("formulaExpression {}", formulaExpression);
return Collections.unmodifiableSet(
Stream.of(formulaExpression.split(","))
.map(String::trim)
.filter(v -> !v.matches("-?\\d+(.\\d+)?"))
//.filter(v -> !v.matches("\\w+"))
.filter(v -> v.length() != 0)
.collect(Collectors.toCollection(() -> new TreeSet<>(String.CASE_INSENSITIVE_ORDER))));
}
public static String replaceFunctions(String str, Set<String> val) {
for (String op : val) {
str = str.replaceAll("(?i)\\b" + Pattern.quote(op) + "\\b", ",");
}
return str;
}
public static String replaceOperators(String str, Set<String> val) {
for (String op : val) {
str = str.replace(op, ",");
}
return str;
}
from evalex.
This should be very easy to implement, simply extract anything that is not a function, operator, (
, )
, ,
or a constant number:
public List<String> getUsedVariables() {
List<String> result = new ArrayList<String>();
Tokenizer tokenizer = new Tokenizer(expression);
while (tokenizer.hasNext()) {
String token = tokenizer.next();
if (functions.containsKey(token) || operators.containsKey(token)
|| token.equals("(") || token.equals(")")
|| token.equals(",") || isNumber(token)) {
continue;
}
result.add(token);
}
return result;
}
from evalex.
Thanks. Took your implementation. You are missing to check on the constants "PI", "TRUE", and "FALSE".
from evalex.
I implemented the function in commit b35f03c
from evalex.
Related Issues (20)
- How to restrict list of operators used in formula evaluation? HOT 1
- Custom ! post fix operator is not called HOT 1
- decimalPlacesRounding has confusing behavior HOT 5
- NoSuchElementException not being caught HOT 2
- Allow to only round the final result
- OutOfMemoryError: for wrong expression with 2 dots HOT 1
- Support arrays as function parameters HOT 7
- Equality depends on input type in 3.1.0
- problem with placeholder HOT 1
- Add module-info (or at least Automatic-Module-Name) HOT 2
- SQRT function doesn't work HOT 3
- With introduction of null, it's better to allow short circuiting (lazy evaluation) for those boolean operators HOT 4
- Equals/NotEquals operator is now sometimes showing inconsistent behavior HOT 1
- Broken boolean expression evaluation in version 3.1.0
- Allow Java arrays as input parameters
- Restore compatibility with Java 8 HOT 2
- Determine evaluation result type without evaluating HOT 2
- Java exception generated when trying to calculate expressions (it worked before with the original EvalEX library in the previous GitHub) HOT 2
- Can arrayJson filtering be supported? HOT 3
- Add a configurable locale to the configuration
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from evalex.