使用java标记表达式

时间:2013-12-09 23:38:43

标签: java regex parsing lexical-analysis

例如,如果表达式可以有+ - / *作为运算符,浮点数

,输入为“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”,然后“+” “ 等等。

但似乎扫描仪不能像这样工作,在查看了其他一些课程后,我找不到一个好的解决方案。

2 个答案:

答案 0 :(得分:4)

您可以使用以下表达式创建两个捕获组:

正则表达式

([0-9\.]+)|([+*\/\-])

简要说明

这之间交替:

[0-9\.]+与浮点数匹配

[+*\/\-]与数学符号匹配。

示例Java代码

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