2012-10-05 29 views
5

Para una herramienta de generación de código en la que estoy trabajando, necesito tomar una cadena y generar un nombre de variable válida de Java, pero no estoy seguro de la mejor manera de hacerlo .Convertir cadena a nombre de variable Java válido

Por ejemplo:

"123 this is some message !" =>_123_this_is_some_message (o algo similar)

Gracias

+2

¿Cuáles son los posibles contenidos de la cadena de entrada? ¿Solo alfanuméricos, signos de puntuación y espacios? Todo en Unicode? – Pops

+0

Sin imponer reglas en la entrada, creo que encontrará colisiones (es decir, asignaciones de varios a uno). Dependiendo de su aplicación, esto puede o no importar. – jpm

+0

Puede tratar de recorrer la cadena y anexar a StringBuilder si es un carácter válido para un nombre de variable Java. El desafío que podría tener es la duplicación de variables, por lo que es posible que desee realizar un seguimiento de lo que ha usado y agregar números si es necesario. – JustinKSU

Respuesta

7

Suponiendo que reemplaza todos los caracteres no válidos por _ algo como el siguiente código podría funcionar (ejemplo aproximado). Es posible que desee añadir un poco de lógica para el nombre colisiones etc. Se basa on the JLS #3.8:

Un identificador es una secuencia de longitud ilimitada de letras y dígitos Java Java, el primero de los cuales debe ser una letra Java.
[...]
Una "letra de Java" es un carácter cuyo método Character.isJavaIdentifierStart (int) devuelve verdadero.
Una "letra o dígito de Java" es un carácter cuyo método Character.isJavaIdentifierPart (int) devuelve verdadero.

public static void main(String[] args) { 
    String s = "123 sdkjh s;sdlkjh d"; 
    StringBuilder sb = new StringBuilder(); 
    if(!Character.isJavaIdentifierStart(s.charAt(0))) { 
     sb.append("_"); 
    } 
    for (char c : s.toCharArray()) { 
     if(!Character.isJavaIdentifierPart(c)) { 
      sb.append("_"); 
     } else { 
      sb.append(c); 
     } 
    } 

    System.out.println(sb); 
} 
+0

Esto fue útil , gracias @assylias –

+0

También podría agregar ''_'' en su lugar (char en lugar de una cadena' "_" '). – NateS

3

Desea convertir cadenas aleatorias en Java identificadores válidos. Según the Java Language Specification, §3.8, la definición de un identificador es la siguiente:

Identifier:
IdentifierChars pero no una palabra clave o BooleanLiteral o NullLiteral

IdentifierChars:
JavaLetter
IdentifierChars JavaLetterOrDigit

JavaLetter:
cualquier carácter Unicode que es una carta de Java

JavaLetterOrDigit:
cualquier carácter Unicode que es una carta o dígitos de Java

A Lo único que tienes que hacer es dar un paso adelante en tu información y reemplazar cualquier carácter no válido por uno válido (p. guión bajo) o eliminarlo por completo. Java incluso proporciona métodos en la clase Character que le indica si un determinado carácter es JavaLetter o JavaLetterOrDigit: isJavaIdentifierStart() y isJavaIdentifierPart. (Esto es mucho más fácil que tratar de excluir caracteres inválidos porque el conjunto de caracteres válidos es pequeño y el conjunto de caracteres inválidos es enorme.)

Al final, recuerde asegurarse de que su resultado no comience con un dígito a no queda con una palabra clave o literal. Si las colisiones son posibles y no deseadas, puede agregar números a sus resultados según sea necesario para obtener valores únicos.

1

Usted debe:

  1. Reemplazar \\s+ con _
  2. Retire todas las apariciones de \\W+
  3. Añadir _ como prefijo, si ^\d partido (o incluso si no)

Algo así como

"_" + myString.replaceAll("\\s+", "_").replaceAll("\\W+", "") 
+0

Esto es bastante restrictivo: muchos caracteres válidos se excluirán con su punto 2. – assylias

+0

@assylias = Ciertamente, mi respuesta es solo una idea básica, que se puede ampliar ... –

+0

assylias, tenga en cuenta que '\ W' de Java debe ser Unicode -aware y así encaja bastante bien la definición de un carácter no identificador. – Joey

Cuestiones relacionadas