对于解析播放器命令,我最常使用split方法通过分隔符拆分字符串,然后通过一系列ifswitch es来找出其余部分。 在Java中解析字符串有哪些不同的方法?

===============>>#1 票数:19

我非常喜欢正则表达式。 只要命令字符串相当简单,您就可以编写一些可能需要几页代码手动解析的正则表达式。

我建议你查看http://www.regular-expressions.info ,了解正则表达式的优秀介绍,以及Java的具体示例。

===============>>#2 票数:15 已采纳

我假设您正在尝试使命令界面尽可能宽容。 如果是这种情况,我建议你使用类似这样的算法:

  1. 读入字符串
    • 将字符串拆分为标记
    • 使用字典将同义词转换为常用表单
    • 例如,将“hit”,“punch”,“strike”和“kick”全部转换为“hit”
    • 在无序的包容性基础上执行操作
    • 无序 - “将猴子打在脸上”与“猴子脸上的脸”相同
    • 包容性 - 如果命令应该是“在面对面打猴子”并且它们提供“打孔猴子”,那么你应该检查这个匹配的命令数量。 如果只有一个命令,请执行此操作。 拥有命令优先级甚至可能是一个好主意,即使有匹配,它也会执行最高操作。

===============>>#3 票数:13

手动解析很有趣......开头:)

实际上,如果命令不是很复杂,您可以像命令行解释器中使用的那样处理它们。 您可以使用以下库列表: http//java-source.net/open-source/command-line 我想你可以从apache commons CLIargs4j (使用注释)开始。 它们有很好的文档记录,使用起来非常简单。 它们自动处理解析,您唯一需要做的就是读取对象中的特定字段。

如果你有更复杂的命令,那么创建一个正式的语法可能是一个更好的主意。 有一个非常好的库,带有用于语法的图形编辑器,调试器和解释器。 它被称为ANTLR (和编辑器ANTLRWorks )并且它是免费的:)还有一些示例语法和教程。

===============>>#4 票数:7

我将看看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。

...

===============>>#5 票数:6

Sun本身建议远离StringTokenizer并使用String.spilt方法。

您还需要查看Pattern类。

===============>>#6 票数:6

对ANTLR / ANTLRWorks的另一次投票。 如果你创建了两个版本的文件,一个是用于实际执行命令的Java代码,另一个是没有(只有语法),那么你就拥有了该语言的可执行规范,非常适合测试,对于文档来说是一个福音如果您决定移植它,那么节省大量时间。

===============>>#7 票数:4

如果这是解析命令行,我建议使用Commons Cli

Apache Commons CLI库提供用于处理命令行界面的API。

===============>>#8 票数:4

尝试JavaCC Java的解析器生成器。

它具有许多用于解释语言的功能,并且在Eclipse上得到了很好的支持。

===============>>#9 票数:2

@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;
}

===============>>#10 票数:1

如果您的文本包含一些分隔符,那么您可以使用split方法。
如果文本包含不规则字符串,则表示格式不同,则必须使用regular expressions

===============>>#11 票数:1

split方法可以将字符串拆分为指定子字符串表达式regex的数组。 它的参数有两种形式,即:split( String regex )和split( String regex, int limit ),其中split( String regex )实际上是通过调用split(String regex,int limit)来实现的, limit是0 那么,当限制> 0限制<0表示什么?

jdk解释:当limit> 0子数组长度达到限制时,也就是说,如果可能的话,可以限制为1次细分,剩下的作为子字符串(除了限制-1次字符有字符串拆分结束) ;

limit <0表示阵列长度没有限制;

limit = 0字符串空字符串的结尾将被截断。 StringTokenizer类是出于兼容性原因而保留的遗留类,因此我们应该尝试使用String类的split方法。 参考链接

===============>>#12 票数:1

空格上的简单字符串标记符应该可以工作,但是有很多方法可以做到这一点。

以下是使用tokenizer的示例:

String command = "kick person";
StringTokenizer tokens = new StringTokenizer(command);
String action = null;

if (tokens.hasMoreTokens()) {
    action = tokens.nextToken();
}

if (action != null) {
    doCommand(action, tokens);
}

然后令牌可以进一步用于参数。 这一切都假设参数中没有使用空格...所以你可能想要推出自己的简单解析机制(比如获取第一个空格并在之前使用文本作为动作,或者如果你不介意那么使用正则表达式)速度命中),只是抽象出来,所以它可以在任何地方使用。

===============>>#13 票数:1

JCommander似乎相当不错,虽然我还没有测试过。

===============>>#14 票数:1

当命令的分隔符String总是相同的String或char(如“;”)y建议你使用StrinkTokenizer类:

StringTokenizer的

但是当分隔符变化或复杂时,建议您使用常规表达式,这可以由String类本身使用,方法分割,从1.4开始。 它使用java.util.regex包中的Pattern类

图案

===============>>#15 票数:1

如果语言像死一样简单

动词名词

然后用手拆分效果很好。

如果它更复杂,你应该真正研究像ANTLR或JavaCC这样的工具。

我在http://javadude.com/articles/antlrtut上有一个关于ANTLR(v2)的教程,它将让你了解它是如何工作的。

  ask by agweber translate from so

未解决问题?本站智能推荐: