Aquí podría ser tu PUBLICIDAD


¿Cuáles son los diferentes métodos para analizar cadenas en Java?

votos
43

Para analizar los comandos de jugador, he utilizado con mayor frecuencia la división método para dividir una cadena por delimitadores y luego a continuación, sólo imaginar el resto por una serie de ifs o switchES. ¿Cuáles son algunas formas diferentes de analizar cadenas en Java?

Publicado el 06/08/2008 a las 00:49
fuente por usuario agweber
En otros idiomas...        العربية       

15 respuestas

votos
19

Realmente me gustan las expresiones regulares. Siempre que las cadenas de comandos sean bastante simples, puede escribir algunas expresiones regulares que podrían tomar algunas páginas de código para analizarlas manualmente.

Le sugiero que consulte http://www.regular-expressions.info para obtener una buena introducción a expresiones regulares, así como ejemplos específicos para Java.

Respondida el 06/08/2008 a las 12:54
fuente por usuario Daniel Broekman


Aquí podría ser tu PUBLICIDAD


votos
14

Supongo que estás tratando de hacer que la interfaz de comando sea tan indulgente como sea posible. Si este es el caso, sugiero que use un algoritmo similar a este:

  1. Leer en la cadena
    • Divide la cadena en tokens
    • Use un diccionario para convertir sinónimos a una forma común
    • Por ejemplo, convierta "golpe", "golpe", "golpe" y "patada" para "golpear"
    • Realizar acciones en una base desordenada e inclusiva
    • Desordenado - "golpear al mono en la cara" es lo mismo que "la cara en el golpe de mono"
    • Inclusive : si se supone que el comando debe ser "golpear al mono en la cara" y le proporcionan "mono punch", debe verificar cuántos comandos concuerda. Si solo un comando, haz esta acción. Incluso podría ser una buena idea tener prioridades de comando, e incluso si hubiera incluso coincidencias, realizaría la acción superior.
Respondida el 06/08/2008 a las 01:42
fuente por usuario andrewrk

votos
13

El análisis manual es muy divertido ... al principio :)

En la práctica, si los comandos no son muy sofisticados, puede tratarlos del mismo modo que los utilizados en los intérpretes de línea de comando. Hay una lista de bibliotecas que puede usar: http://java-source.net/open-source/command-line . Creo que puede comenzar con Apache commons CLI o args4j (usa anotaciones). Están bien documentados y son realmente simples de usar. Manejan el análisis automáticamente y lo único que debe hacer es leer campos particulares en un objeto.

Si tiene comandos más sofisticados, entonces quizás crear una gramática formal sería una mejor idea. Hay una biblioteca muy buena con editor gráfico, depurador e intérprete para gramáticas. Se llama ANTLR (y el editor ANTLRWorks ) y es gratis :) También hay algunos ejemplos de gramáticas y tutoriales.

Respondida el 30/08/2008 a las 11:26
fuente por usuario Bartosz Bierkowski

votos
7

Me gustaría ver migraciones Java de Zork , y se inclinan hacia un simple procesador de lenguaje natural (impulsado ya sea por tokenizing o expresiones regulares), tales como las siguientes (desde este enlace):

    public static boolean simpleNLP (String inputline, String keywords [])
    {
        int i;
        int maxToken = palabras clave.length;
        int a, desde;
        if (inputline.length () = inputline.length ()) return false; // verifica si hay líneas en blanco y vacías
        while (to> = 0)
        {
            to = inputline.indexOf ('', from);
            if (to> 0) {
                lexed.addElement (inputline.substring (from, to));
                de = a;
                while (inputline.charAt (from) == ''
                && from = keywords.length) {status = true; descanso;}
            }
        }
        estado de devolución;
    }

...

Todo lo que le da al programador un motivo para volver a mirar a Zork es bueno en mi libro, solo ten cuidado con Grues.

...

Respondida el 06/08/2008 a las 01:16
fuente por usuario user2189331

votos
6

Otro voto para ANTLR / ANTLRWorks. Si crea dos versiones del archivo, una con el código Java para ejecutar realmente los comandos y otra sin (con solo la gramática), entonces tiene una especificación ejecutable del lenguaje, que es ideal para probar, una gran ayuda para la documentación , y un gran ahorro de tiempo si alguna vez decide portarlo.

Respondida el 31/08/2008 a las 02:38
fuente por usuario John with waffle

votos
6

Sun recomienda mantenerse alejado de StringTokenizer y usar el método String.spilt.

También querrás mirar la clase Pattern.

Respondida el 06/08/2008 a las 05:14
fuente por usuario bpapa

votos
4

Pruebe JavaCC, un generador de analizadores para Java.

Tiene muchas funciones para interpretar idiomas y está bien soportado en Eclipse.

Respondida el 31/08/2008 a las 08:45
fuente por usuario Alotor

votos
4

Si esto es para analizar las líneas de comando, sugeriría usar Commons Cli .

La biblioteca CLI de Apache Commons proporciona una API para procesar interfaces de línea de comando.

Respondida el 31/08/2008 a las 02:05
fuente por usuario SaM

votos
2

@CodingTheWheel Aquí está tu código, un poco de limpieza y a través de eclipse ( ctrl+ shift+ f) y el insertado aquí :)

Incluyendo los cuatro espacios al frente de cada línea.

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;
}
Respondida el 06/08/2008 a las 04:18
fuente por usuario svrist

votos
1

método división puede dividir una cadena en una matriz de la expresión subcadena especificada regex. Sus argumentos en dos formas, a saber: split ( String regex) y división ( String regex, int limit), que Split ( String regex) es en realidad llamando división (String expresiones regulares, límite int) para lograr, límite es 0 . Entonces, cuando el límite> 0 y el límite <0 representa qué?

Cuando el JDK explicó: cuando límite> 0 sub-matriz de una longitud de hasta limitar, es decir, si es posible, puede ser límite-1 sub-división, permaneciendo como una subcadena (excepto por límite-1 veces el personaje ha string extremo partido) ;

límite <0 indica que no hay límite en la longitud de la matriz;

límite = 0 extremo de la cadena vacía cadena se truncará. StringTokenizerclase es por razones de compatibilidad y se conserva el legado de clase, por lo que debe tratar de utilizar el método de división de la clase String. referirse a vincular

Respondida el 13/05/2014 a las 03:13
fuente por usuario shouyu

votos
1

Si el texto contiene algunos delimitadores entonces usted puede su splitmétodo.
Si el texto contiene cadenas irregulares medio distinto formato en el que se debe utilizar regular expressions.

Respondida el 24/11/2012 a las 10:17
fuente por usuario Pratik

votos
1

JCommander parece bastante bueno, aunque todavía tengo que probarlo.

Respondida el 20/08/2010 a las 02:59
fuente por usuario Pierre Gardin

votos
1

Si el lenguaje es tan simple como simplemente

SUSTANTIVO VERBO

luego, dividir a mano funciona bien.

Si es más complejo, deberías buscar una herramienta como ANTLR o JavaCC.

Tengo un tutorial sobre ANTLR (v2) en http://javadude.com/articles/antlrtut que le dará una idea de cómo funciona.

Respondida el 16/09/2008 a las 04:35
fuente por usuario Scott Stanchfield

votos
1

Cuando el separador String para el comando es siempre el mismo String o char (como el ";"), le recomendamos que use la clase StrinkTokenizer:

StringTokenizer

pero cuando el separador varía o es complejo, te recomiendo que uses las expresiones regulares, que pueden ser usadas por la clase String misma, método dividido, desde 1.4. Utiliza la clase Pattern del paquete java.util.regex

Patrón

Respondida el 06/08/2008 a las 04:40
fuente por usuario Telcontar

votos
1

Un tokenizador de cadena simple en espacios debería funcionar, pero hay muchas maneras en que podrías hacer esto.

Aquí hay un ejemplo usando un 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);
}

Entonces los tokens se pueden usar para los argumentos. Todo esto supone que no se utilizan espacios en los argumentos ... por lo que es posible que desee desplegar su propio mecanismo de análisis simple (como obtener el primer espacio en blanco y usar texto antes como acción, o usar una expresión regular si no le importa el golpe de velocidad), simplemente resúmalo para que pueda usarse en cualquier lugar.

Respondida el 06/08/2008 a las 12:57
fuente por usuario Mike Stone


Aquí podría ser tu PUBLICIDAD