代码之家  ›  专栏  ›  技术社区  ›  agweber

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

  •  44
  • agweber  · 技术社区  · 17 年前

    对于解析播放器命令,我经常使用 split 方法通过分隔符拆分字符串,然后通过一系列 if S或 switch 锿。在Java中解析字符串的方式有哪些不同?

    15 回复  |  直到 9 年前
        1
  •  14
  •   andrewrk    17 年前

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

    1. 读取字符串
      • 将字符串拆分为标记
      • 使用词典将同义词转换为常用形式
      • 例如,将“hit”、“punch”、“strike”和“kick”全部转换为“hit”
      • 在无序、包容的基础上执行操作
      • 无序的 -“猛击猴子的脸”和“猛击猴子的脸”是一样的。
      • 包容的 -如果命令应该是“猛击猴子的脸”,他们提供“猛击猴子”,您应该检查这匹配的命令数量。如果只有一个命令,请执行此操作。拥有命令优先级甚至是一个好主意,即使有匹配项,它也会执行顶级操作。
        2
  •  19
  •   Code Lღver Ionut Rusen    13 年前

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

    我建议你退房 http://www.regular-expressions.info 一个很好的介绍正则表达式,以及Java的具体例子。

        3
  •  13
  •   Matt Ball    13 年前

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

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

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

        4
  •  7
  •   Justin Standard    17 年前

    我会看看 Java migrations 属于 Zork 向一个简单的 Natural Language Processor (通过标记化或regex驱动)例如(通过此链接):

        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的东西都是好的,只要当心咕噜声就行了。

        5
  •  6
  •   bpapa    17 年前

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

    您还需要查看模式类。

        6
  •  6
  •   John with waffle    16 年前

    对安特尔/安特尔工厂的另一次投票。如果您创建文件的两个版本,一个是用Java代码来实际执行命令,另一个则没有(仅使用语法),那么您有一个可执行的语言规范,这对于测试来说是很好的,对于文档来说是一个福音,如果您决定将它移植到一个大的时间里。

        7
  •  4
  •   SaM    16 年前

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

    ApacheCommonsCLI库提供用于处理命令行接口的API。

        8
  •  4
  •   Magnilex BesaFX    10 年前

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

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

        9
  •  2
  •   Valery Viktorovsky    10 年前

    @在这里编码你的代码,有点清理和通过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;
    }
    
        10
  •  1
  •   Mike Stone    17 年前

    在空间上使用一个简单的字符串标记器是可行的,但是有很多方法可以做到这一点。

    下面是一个使用标记器的例子:

    String command = "kick person";
    StringTokenizer tokens = new StringTokenizer(command);
    String action = null;
    
    if (tokens.hasMoreTokens()) {
        action = tokens.nextToken();
    }
    
    if (action != null) {
        doCommand(action, tokens);
    }
    

    然后标记可以进一步用于参数。这都假定参数中没有使用空格…因此,您可能希望使用自己的简单解析机制(例如,获取第一个空格,并将前面的文本用作操作,或者使用正则表达式(如果您不介意速度的影响),将其抽象出来,以便可以在任何地方使用。

        11
  •  1
  •   Telcontar    17 年前

    当命令的分隔符字符串完全相同时,建议使用strinktokenizer类:

    StringTokenizer

    但是当分隔符变化或复杂时,建议您使用正则表达式,wich可以由字符串类本身使用,方法split,因为1.4。它使用java.util.regex包中的模式类

    Pattern

        12
  •  1
  •   Scott Stanchfield    16 年前

    如果语言很简单就像

    动名词

    然后用手分裂很有效。

    如果更复杂的话,您应该真正研究一个工具,比如antlr或javacc。

    我有一个关于Antlr(v2)的教程 http://javadude.com/articles/antlrtut 这会让你了解它是如何工作的。

        13
  •  1
  •   Pierre Gardin    15 年前

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

        14
  •  1
  •   Pratik    12 年前

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

        15
  •  1
  •   Iamat8    9 年前

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

    JDK 解释:什么时候 极限值>0 子数组长度上限,也就是说,如果可能,可以 极限-1 子除法,保留为子字符串(除了按限制1倍字符有字符串拆分结束);

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

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