在Java中解析字符串有哪些不同的方法?
对于解析播放器命令,我最常使用split方法通过定界符分割字符串,然后仅通过一系列if或者switch来找出其余字符。 Java中解析字符串的几种不同方式是什么?
解决方案
回答
我真的很喜欢正则表达式。只要命令字符串相当简单,我们就可以编写一些正则表达式,而这些正则表达式可能需要花费几页代码才能进行手动解析。
我建议我们查看http://www.regular-expressions.info,以获取有关正则表达式的良好介绍以及Java的特定示例。
回答
在空间上使用简单的字符串标记器应该可以,但是实际上有很多方法可以执行此操作。
这是一个使用分词器的示例:
String command = "kick person"; StringTokenizer tokens = new StringTokenizer(command); String action = null; if (tokens.hasMoreTokens()) { action = tokens.nextToken(); } if (action != null) { doCommand(action, tokens); }
然后可以将令牌进一步用作参数。所有这些都假设参数中没有使用空格...因此,我们可能希望使用自己的简单解析机制(例如获取第一个空格并在操作之前使用文本,或者如果我们不介意使用正则表达式,快速点击),只需将其抽象出来即可在任何地方使用。
回答
我将研究Zork的Java迁移,并倾向于一个简单的自然语言处理器(由标记化或者正则表达式驱动),例如(从此链接):
public static boolean simpleNLP( String inputline, String keywords[]) { int i; int maxToken = keywords.length; int to,from; if( inputline.length() = inputline.length()) return false; // check for blank and empty lines while( to >=0 ) { to = inputline.indexOf(' ',from); if( to > 0){ lexed.addElement(inputline.substring(from,to)); from = to; while( inputline.charAt(from) == ' ' && from = keywords.length) { status = true; break;} } } return status; }
...
在我的书中,任何使程序员有理由再次看一下Zork的东西都是好事,只是要提防Grues。
...
回答
我假设我们正在尝试使命令界面尽可能地宽容。如果是这种情况,建议我们使用类似于以下的算法:
- 使用字典将同义词转换为常用形式
- 例如,将" hit"," punch"," strike"和" kick"全部转换为" hit"
- 在无序的基础上执行操作
- 无序-"将猴子打在脸上"与"将猴子打在脸上"相同
- 包含-如果命令应该是"打猴子",而他们提供"打猴子",则应检查此命令匹配多少个命令。如果只有一个命令,请执行此操作。具有命令优先级甚至是一个好主意,即使有匹配项,它也将执行最高动作。
回答
@CodingTheWheel这是代码,经过清理并通过eclipse(ctrl
+shift
+f
),然后插入此处:)
每行前面包括四个空格。
public static boolean simpleNLP(String inputline, String keywords[]) { if (inputline.length() < 1) return false; List<String> lexed = new ArrayList<String>(); for (String ele : inputline.split(" ")) { lexed.add(ele); } boolean status = false; to = 0; for (i = 0; i < lexed.size(); i++) { String s = (String) lexed.get(i); if (s.equalsIgnoreCase(keywords[to])) { to++; if (to >= keywords.length) { status = true; break; } } } return status; }
回答
当命令的分隔符String始终为相同的String或者char(例如";")时,建议我们使用StrinkTokenizer类:
StringTokenizer
但是当分隔符变化或者很复杂时,建议我们使用常规表达式,String类本身可以使用分裂方法,从1.4开始。它使用java.util.regex包中的Pattern类
图案
回答
Sun本身建议不要使用StringTokenizer,而应使用String.spilt方法。
我们还需要查看Pattern类。
回答
手动解析很有趣……在一开始:)
在实践中,如果命令不是很复杂,我们可以将它们与命令行解释器中使用的方法一样对待。我们可以使用以下库列表:http://java-source.net/open-source/command-line。我认为我们可以从apache commons CLI或者args4j(使用批注)开始。它们有据可查,使用起来非常简单。它们自动处理解析,我们唯一需要做的就是读取对象中的特定字段。
如果我们有更复杂的命令,那么创建一个正式的语法可能是一个更好的主意。有一个非常好的库,其中包含用于语法的图形编辑器,调试器和解释器。它称为ANTLR(和编辑器ANTLRWorks),它是免费的:)还有一些示例语法和教程。
回答
如果要解析命令行,我建议使用Commons Cli。
The Apache Commons CLI library provides an API for processing command line interfaces.
回答
ANTLR / ANTLRWorks的另一票。如果我们创建文件的两个版本,一个带有用于实际执行命令的Java代码,另一个不带有(仅具有语法),则我们将拥有该语言的可执行规范,这对于测试非常有用,而对于文档而言则是福音。 ,如果我们决定移植它,则可以节省大量时间。
回答
尝试使用JavaCC Java解析器生成器。
它具有许多用于解释语言的功能,并且在Eclipse上得到了很好的支持。
回答
如果语言很简单,就像
动词名词
然后手工分割效果很好。
如果更复杂,我们应该真正研究一下ANTLR或者JavaCC之类的工具。
我在http://javadude.com/articles/antlrtut上有一个有关ANTLR(v2)的教程,它将使我们了解它的工作原理。
回答
JCommander看起来还不错,尽管我尚未对其进行测试。