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

Translate

对于解析播放器命令,我最常使用分裂用定界符分割字符串,然后再用一系列ifs或switches。 Java中解析字符串的几种不同方式是什么?

This question and all comments follow the "Attribution Required."

所有的回答

Translate

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

  1. Read in the string
    • 将字符串拆分为令牌
    • 使用字典将同义词转换为常用形式
    • 例如,将“ hit”,“ punch”,“ strike”和“ kick”全部转换为“ hit”
    • 在无序的基础上执行操作
    • 无序-“打猴子脸”与“打猴子脸”是一样的
    • 包括的-如果命令应该是“打猴子”,并且提供“打猴子”,则应检查该命令匹配多少个命令。如果只有一个命令,请执行此操作。具有命令优先级甚至是一个好主意,即使有匹配项,它也将执行最高动作。
来源
Translate

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

我建议你退房http://www.regular-expressions.info有关正则表达式的良好介绍以及Java的特定示例。

来源
Translate

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

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

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

来源
Myra Lee
Translate

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

...

来源
Translate

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

您还需要查看Pattern类。

来源
Translate

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

来源
SaM
Translate

如果这是解析命令行,我建议使用下议院.

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

来源
Translate

尝试JavaCCJava的解析器生成器。

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

来源
Translate

@CodingTheWheel这是您的代码,经过清理和通过eclipse(ctrl+转移+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;
}
来源
Translate

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

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

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

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

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

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

来源
Translate

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

StringTokenizer

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

模式

来源
Translate

如果语言很简单,就像

动词名词

然后手工分割效果很好。

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

我有一个有关ANTLR(v2)的教程,网址为http://javadude.com/articles/antlrtut这将使您了解其工作原理。

来源
Translate

指挥官看起来还不错,尽管我尚未进行测试。

来源
Translate

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

来源
Translate

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

当。。。的时候杰克解释:何时限制> 0子数组的长度上限,即如果可能,可以极限1细分,保留为子字符串(除非字符的字符串分割结束为limit-1倍,否则除外);

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

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

来源