在Java中解析字符串有哪些不同的方法?

时间:2020-03-05 18:37:54  来源:igfitidea点击:

对于解析播放器命令,我最常使用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看起来还不错,尽管我尚未对其进行测试。