例如,如果表达式可以有+ - / *作为运算符,浮点数
,输入为“3.5 + 6.5-4.3 * 4/5”
如何写一个程序,一个接一个地返回“3.5”“+”“6.5”“ - ”“4.3”“*”“4”“/”“5”,我试着写这些正则表达式ie “[*]”,“[/]”,“[+]”,“[ - ]”和数字模式,并使用:
Scanner sc = new Scanner("3.5+6.5-4.3*4/5");
并使用sc.hasNext(pattern);
循环遍历每个模式,我希望它保持匹配字符串的开头直到它匹配数字模式,并sc.nect(pattern)
得到“3.5”,然后“+” “ 等等。
但似乎扫描仪不能像这样工作,在查看了其他一些课程后,我找不到一个好的解决方案。
答案 0 :(得分:4)
您可以使用以下表达式创建两个捕获组:
([0-9\.]+)|([+*\/\-])
这之间交替:
[0-9\.]+
与浮点数匹配
和
[+*\/\-]
与数学符号匹配。
List<String> matchList = new ArrayList<String>();
try {
Pattern regex = Pattern.compile("([0-9.]+)|([+*/\\-])");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
matchList.add(regexMatcher.group());
}
} catch (PatternSyntaxException ex) {
// Syntax error in the regular expression
}
答案 1 :(得分:1)
对于非平凡的解析,我建议使用解析器创建器(例如JavaCC)。
或者,您列出的示例可能会使用Java支持的许多脚本语言之一(包括JavaScript)来涵盖。请参阅here。
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
// Result is object of type "Double"
Object result = engine.eval("3.5+6.5-4.3*4/5");
// Format output result
System.out.println(new DecimalFormat("0.######").format(result));
...此代码的输出是
6.56