【问题标题】:Tokenising expressions using java使用java标记表达式
【发布时间】:2013-12-09 23:38:42
【问题描述】:

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

输入为“3.5+6.5-4.3*4/5”

应该如何编写一个程序,一个一个返回“3.5”“+”“6.5”“-”“4.3”“*”“4”“/”“5”,我试着为这些写正则表达式,即"[*]", "[/]","[+]","[-]" 和数字的模式,并使用:

Scanner sc = new Scanner("3.5+6.5-4.3*4/5");

并使用sc.hasNext(pattern); 循环遍历每个模式,我希望它继续匹配字符串的开头直到它匹配数字模式,sc.nect(pattern) 得到“3.5”,然后是“+”等等.

但是扫描仪好像不是这样工作的,在查看了其他一些类之后,我找不到一个好的解决方案。

【问题讨论】:

  • 扫描仪通常只有在您事先知道输入的格式时才有用。最好的方法是读取整行,然后将其拆分为运算符和操作数。

标签: java regex parsing lexical-analysis


【解决方案1】:

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

正则表达式

([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
}

【讨论】:

    【解决方案2】:

    对于非平凡的解析,我建议使用解析器创建器(例如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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多