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

xnemo 发布于 2018-02-26 java 最后更新 2018-02-26 01:01 1228 浏览

为了解析玩家命令,我经常使用split方法通过分隔符分割字符串,然后通过一系列ifs或switches找出其余的。在Java中解析字符串有哪些不同的方法?

已邀请:

lnon

赞同来自:

我真的很喜欢正则表达式。只要命令字符串非常简单,您可以编写几个正则表达式,这些正则表达式可能需要几页代码才能手动解析。 我建议你查看http://www.regular-expressions.info以了解正则表达式,以及Java的具体示例。

ddolor

赞同来自:

一个简单的字符串标记在空间应该工作,但有很多方法可以做到这一点。 以下是使用标记器的示例:

String command = "kick person";
StringTokenizer tokens = new StringTokenizer(command);
String action = null;
if (tokens.hasMoreTokens()) {
    action = tokens.nextToken();
}
if (action != null) {
    doCommand(action, tokens);
}
然后令牌可以进一步用于参数。这一切都假设参数中没有空格......所以你可能想要推出你自己的简单解析机制(比如获取第一个空格并使用之前的文本作为动作,或者如果你不介意使用正则表达式速度打击),只需将其抽象出来,以便随时随地使用。

funde

赞同来自:

我会查看Java migrationsZork,并倾向于一个简单的Natural Language Processor(由标记或正则表达式驱动),如下所示(通过此链接):

    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。 ...

wfuga

赞同来自:

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

  1. 读入字符串
    • 将字符串拆分为令牌
    • 使用字典将同义词转换为常见形式
    • 例如,将“点击”,“拳击”,“敲击”和“踢”全部转换为“点击”
    • 对无序的包容性基础
    • 执行操作
    • 无序 - “在脸上捶打猴子”与“猴子的脸孔”是一回事
    • 包容性 - 如果该命令应该是“将猴子打在脸上”并且它们提供“punch monkey”,那么您应该检查这个匹配的命令数。如果只有一个命令,请执行此操作。具有命令优先级甚至可能是一个好主意,即使有匹配,也会执行最高命令。

ut_sit

赞同来自:

你的代码,有点清理,并通过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;
}

faut

赞同来自:

当命令的分隔符字符串全是相同的字符串或字符(如“;”)时,建议您使用StrinkTokenizer类: StringTokenizer 但是当分隔符变化或复杂时,建议您使用常规表达式,自1.4开始,String类本身可以使用方法split。它使用java.util.regex包中的Pattern类 Pattern

et_est

赞同来自:

Sun本身建议远离StringTokenizer并使用String.spilt方法。 你也会想看看Pattern类。

ueos

赞同来自:

手动解析非常有趣...在开始:) 在实践中,如果命令不是很复杂,你可以像命令行解释器中那样对待它们。有一个您可以使用的库列表:http://java-source.net/open-source/command-line。我认为你可以从apache commons CLIargs4j开始(使用注释)。他们有很好的文件记录,使用起来非常简单。他们自动处理解析,并且唯一需要做的是读取对象中的特定字段。 如果你有更复杂的命令,那么创建一个正式的语法将是一个更好的主意。有一个非常好的图书馆,图形编辑器,调试器和语法解释器。它被称为ANTLR(和编辑器ANTLRWorks),它是免费的:)也有一些例子语法和教程。

ysequi

赞同来自:

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

The Apache Commons CLI library provides an API for processing command line interfaces.

yalias

赞同来自:

对ANTLR/ANTLRWorks进行另一次投票。如果您创建了两个版本的文件,一个是用于实际执行命令的Java代码,另一个是没有(仅使用语法)的文件,那么您可以执行该语言的可执行规范,这对于测试非常有用,是文档的福音,并且如果你决定移植它,那么这是一个很大的倍频程序。

onam

赞同来自:

尝试JavaCC用于Java的解析器生成器。 它具有很多用于解释语言的功能,并且在Eclipse上得到了很好的支持。

yeum

赞同来自:

如果这种语言像正义一样简单 动词名词 然后用手分开效果很好。 如果它更复杂,你应该看看像ANTLR或JavaCC这样的工具。 我在http://javadude.com/articles/antlrtut上有一个关于ANTLR(v2)的教程,它会告诉你它是如何工作的。

nipsa

赞同来自:

JCommander看起来相当不错,虽然我还没有测试它。

bsit

赞同来自:

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

nnihil

赞同来自:

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 子数组长度达到限制时,也就是说,如果可能的话,可以是 limit-1 -division,作为子字符串保留(除了限制 - 字符串分割结束的1倍); 限制<0 表示对阵列的长度没有限制; limit = 0 结尾的字符串空字符串将被截断。 StringTokenizer类是出于兼容性的原因,并且保留了传统类,所以我们应该尝试使用String类的split方法。 请参阅link