【问题标题】:Alternatives to Java's Scanner class for console input用于控制台输入的 Java 的 Scanner 类的替代品
【发布时间】:2012-12-14 16:19:45
【问题描述】:

对于初级/中级程序员,使用 Scanner 类从控制台读取输入的替代方法有哪些?

我昨天开始看,Google 带我看了一些关于自然语言处理的文章和一些自然语言处理工具包的列表。我发现的列表没有很好的注释,而且主题变得非常先进,很快。

我问是因为我开始想知道如何制作自定义分隔符列表,例如“+”| "-" | "*" | “/”。使用 Scanner 似乎无法做到这一点。

【问题讨论】:

  • 您打算创建自定义分隔符列表还是自定义组合?因为 Scanner 确实允许您指定自己的分隔符模式。但听起来您希望分隔符区分上下文?
  • 不确定您真正想要什么,但您可以使用正则表达式、indexOf()、分词器等拆分字符串。
  • @Perception - 是的,上下文相关,因此如果有人输入一个简单的数学表达式,例如“3 + 5”或“4 * 2”,我可以使用 Scanner(或其他)解析它.
  • @PhiLho - 这就是我一直在做的事情,但我想知道是否有像 Google 的 Guava 这样的东西可以为我做到这一点。
  • 不确定是否要在扫描阶段处理此问题,因为您需要分隔符和标记。读入整个输入字符串然后解析它会更好地描述您的描述。

标签: java console java.util.scanner


【解决方案1】:

我开始想知道如何制作自定义分隔符列表,例如“+”| "-" | "*" | “/”。使用 Scanner 似乎无法做到这一点。

您是否正在尝试实现这样的目标?

String text="Some text +with -delimiters *described /above";
Scanner in=new Scanner(text);
in.useDelimiter("\\+|\\-|\\*|/"); // +,-,* are metacharacters in regex
                                  // to escape its special meaning we need 
                                  // to use "\\" before each of them
int counter=0;
while(in.hasNext())
    System.out.println(counter++ +") "+ in.next());

输出

0) Some text 
1) with 
2) delimiters 
3) described 
4) above

【讨论】:

  • 是的,这就是我想要做的。因此,您不必在 useDelimiter() 参数中包含任何内容来表明您希望它继续使用除了您列出的空格之外的空格吗?
  • @e.inglewood 不确定“继续使用空格”是什么意思。要在分隔符中包含空格,您可以在它之前和之后使用 \\s,例如 \\s*(\\+|\\-|\\*|/)\\s*(* 表示它之前的 0 个或多个元素)
【解决方案2】:

听起来您正在编写解释器,并且想要评估您传入的表达式。

我的建议是查看Flex,它将对您的输入进行词法分析并将其转换为标记。然后看一下Gnu Bison,它将获取该标记集,并将它们解析为表达式树。

Flex 和 Bison 将在您的程序内部有效地创建一个“迷你编译器”,并使用它来解析输入,但这将使您能够比使用 Scanner 更好地处理上下文相关的事情。

TL;DR

Flex:字符串 -> 标记

Bison:令牌 -> 表达式树

你:表情树 -> 魔法

【讨论】:

  • 谢谢。我会看看这两个。
【解决方案3】:

您可以使用 BufferedReaders 和 InputStreams 来做到这一点。

BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System.in));

【讨论】:

    猜你喜欢
    • 2012-08-05
    • 1970-01-01
    • 2010-11-25
    • 2011-05-07
    • 1970-01-01
    • 2020-10-12
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多