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

对于解析播放器命令,我最常使用split方法通过定界符对字符串进行分割,然后再通过一系列ifs或switches找出其余部分。 Java中解析字符串的几种不同方式是什么?

agweber asked 2020-02-13T13:44:16Z
15个解决方案
19 votes

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

我建议您查看[http://www.regular-expressions.info],以获取有关正则表达式的良好介绍以及Java的特定示例。

Daniel Broekman answered 2020-02-13T13:52:57Z
15 votes

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

  1. 读入字符串
    • 将字符串拆分为令牌
    • 使用字典将同义词转换为常用形式
    • 例如,将“ hit”,“ punch”,“ strike”和“ kick”全部转换为“ hit”
    • 在无序的基础上执行操作
    • 无序-“将猴子打在脸上”与“将猴子打在脸上”相同
    • 包容性-如果命令应该是“打猴子”,而他们提供“打猴子”,则应检查此命令匹配多少个命令。 如果只有一个命令,请执行此操作。 具有命令优先级甚至是一个好主意,即使有匹配项,它也将执行最高动作。
andrewrk answered 2020-02-13T13:52:31Z
13 votes

手动解析很有趣……在一开始:)

在实践中,如果命令不是很复杂,则可以将它们与命令行解释器中使用的方法一样对待。 有可用的库列表:[http://java-source.net/open-source/command-line。]我认为您可以从apache commons CLI或args4j(使用批注)开始。 它们有据可查,使用起来非常简单。 它们自动处理解析,您唯一需要做的就是读取对象中的特定字段。

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

Bartosz Bierkowski answered 2020-02-13T13:53:27Z
7 votes

我将研究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。

...

Justin Standard answered 2020-02-13T13:54:00Z
6 votes

Sun本身建议不要使用StringTokenizer,而应使用String.spilt方法。

您还需要查看Pattern类。

bpapa answered 2020-02-13T13:54:29Z
6 votes

ANTLR / ANTLRWorks的另一票。 如果您创建文件的两个版本,一个带有用于实际执行命令的Java代码,另一个不带有(仅具有语法),则您将拥有该语言的可执行规范,这对于测试非常有用,而对于文档而言则是福音。 ,如果您决定移植它,则可以节省大量时间。

John with waffle answered 2020-02-13T13:54:51Z
4 votes

如果要解析命令行,我建议使用Commons Cli。

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

SaM answered 2020-02-13T13:55:16Z
4 votes

尝试使用JavaCC Java解析器生成器。

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

Alotor answered 2020-02-13T13:55:44Z
2 votes

@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;
}
svrist answered 2020-02-13T13:56:09Z
1 votes

在空间上使用简单的字符串标记器应该可以,但是实际上有很多方法可以执行此操作。

这是一个使用分词器的示例:

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

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

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

然后可以将令牌进一步用作参数。 所有这些都假设参数中没有使用空格...因此,您可能希望使用自己的简单解析机制(例如获取第一个空格并在操作之前使用文本,或者如果您不介意使用正则表达式, 快速命中),只需将其抽象出来即可在任何地方使用。

Mike Stone answered 2020-02-13T13:56:40Z
1 votes

当命令的分隔符String始终为相同的String或char(例如“;”)时,建议您使用StrinkTokenizer类:

StringTokenizer

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

图案

Telcontar answered 2020-02-13T13:57:14Z
1 votes

如果语言很简单,就像

动词名词

然后手工分割效果很好。

如果更复杂,则应真正研究ANTLR或JavaCC之类的工具。

我在[http://javadude.com/articles/antlrtut]上有一个有关ANTLR(v2)的教程,它将使您了解它的工作原理。

Scott Stanchfield answered 2020-02-13T13:57:52Z
1 votes

JCommander看起来还不错,尽管我尚未对其进行测试。

Pierre Gardin answered 2020-02-13T13:58:13Z
1 votes

如果您的文本包含一些定界符,则可以使用split方法。
如果文本包含不规则字符串,则意味着其中的格式不同,则必须使用regular expressions

Pratik answered 2020-02-13T13:58:38Z
1 votes

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

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

limit <0表示对数组长度没有限制;

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

shouyu answered 2020-02-13T13:59:14Z
translate from https://stackoverflow.com:/questions/2968/what-are-the-different-methods-to-parse-strings-in-java