Quiero analizar una declaración de variable de instrucción y de obtener el nombre de la variable. Yo estoy haciendo el de abajo

String var = "private   String   ipaddress;";

i m utilizando la expresión regular de patrón de abajo para que coincida con la cadena

.*private\s+([a-z]*)\s+([a-z0-9_]*);

No funciona. Se dice que no se encuentra coincidencia ¿Puede alguien por favor ayuda.

  • Sólo por curiosidad – a pesar de que podría permitir que nos ayudará aún mejor: ¿cuál es el caso de uso para esto? ¿Qué quieres lograr con ese análisis?
InformationsquelleAutor Krishnaveni | 2012-02-08

5 Comentarios

  1. 10

    Primero de todo, quitar ese punto desde el comienzo de la expresión regular, ya que requiere de un personaje antes de la private para un partido.

    Segundo, su expresión regular es sensible a mayúsculas y minúsculas y no coincide con el capital s. Utilizar [a-zA-Z] o hacer que la expresión de mayúsculas y minúsculas ((?i) en el inicio IIRC).

    Por cierto, [a-zA-Z0-9_] sería el mismo que \w.

    Otra cosa: su expresión también de la captura ilegal de los nombres de las variables, así como miss legales. Las Variables no están permitidos para comenzar con un número, pero que también pueden contener signos de dólar. Por lo tanto la expresión de nombre debería ser algo así como ([a-zA-Z_$][\w$]*) significado el primer carácter debe ser una letra, un guión bajo o un signo de dólar seguido por cualquier número de palabras, caracteres o signos de dólar.

    Una última nota: dependiendo de lo que haga con esas declaraciones, tenga en cuenta que puede que tenga que comprobar por esas palabras reservadas. El ajustado expresión seguiría partido "private String private", por ejemplo.

    Una última nota: tenga en cuenta que hay más modificadores de private para una variable, por ejemplo,public, protected, static etc. – o ninguno en absoluto.

    Editar:

    Ahora que tienen el asterisco después del primer punto, que no debería ser un problema para su caso especial. Sin embargo, un punto que coincida con casi cualquier personaje, y por lo tanto coincide fooprivate así. Dependiendo de lo que usted desea lograr quitar el punto o agregar un \s+ después de la .*.

    • el punto en el principio es correcto, ya que es seguido por un * que también coincide con ninguna aparición de la dot.
    • sí, ahora es algo correcto, aunque podría coincidir con el barprivate así. Sin embargo, cuando escribí eso, el asterisco se encuentra (o al menos yo no lo vi, debido a problemas de formato) 🙂
    • OK, y 1 más razón para no usar regex para analizar…
    • eso es cierto, sobre todo si finalmente se quiere analizar el código fuente completo de archivos (yo todavía no sé lo que él está tratando de lograr).
  2. 5

    Desde la declaración de una variable en Java puede tener más de 3 palabras antes de que el nombre de la variable, le sugiero que no limite la búsqueda y el uso de este:

    String var = "private   String   ipaddress;";
    //String var2 = "private static final int test=13;";
    
    Pattern p = Pattern.compile(".+\s(.+?)(;|=)");
    Matcher m = p.matcher(var);
    
    while(m.find()){
        System.out.println(m.group(1));
    }

    Buscará cualquier nombre de variable que comienza con un espacio en blanco y termina con «;» o «=». Esta es una búsqueda más general de nombre de la variable.

    EDITAR Este me puso a pensar, de hecho, ya que esta también es la declaración legal en Java:

    private
    static
    volatile
    String
    s , t1 = "";

    De hecho, esto podría ser mejorado, probablemente, como se pensó/hacer de forma rápida.

    public static void main(String[] args) {
    String var0 = "private static final int test,test2;";
    String var1 = "private \n static \n final \n int \n testName \n =\n   5 \n";
    String var2 = "private \n static \n final \n String \n testName \n =\n  \" aaa           = bbbb   \" \n";
    String var3 = "private \n static \n final \n String \n testName,testName2 \n =\n  \" aaa           = bbbb   \" \n";
    String var4 = "int i;";
    String var5 = "String s ;";
    String var6 = "final String test ;  ";
    String var7 = "public int go = 23;";
    String var8 = "public static final int value,valu2 ; ";
    String var9 = "public static final String t,t1,t2 = \"23\";";
    String var10 = "public \n static \n final \n String s1,s2,s3 = \" aaa , bbb, fff, = hhh = , kkk \";";
    String var11 = "String myString=\"25\"";
    LinkedList<String> input = new LinkedList<String>();
    input.add(var0);input.add(var1);input.add(var2);input.add(var3);input.add(var4);input.add(var5);
    input.add(var6);input.add(var7);input.add(var8);input.add(var9);input.add(var10);
    input.add(var11);
    LinkedList<String> result = parametersNames(input);
    for(String param: result){
    System.out.println(param);
    }
    }
    private static LinkedList<String> parametersNames(LinkedList<String> input){
    LinkedList<String> result = new LinkedList<String>();
    for(String var: input){
    if(var.contains("\n")) var = var.replaceAll("\n", "");
    var = var.trim();
    if(var.contains("=")){
    var = var.substring(0, var.indexOf("=")).trim() + "";
    Pattern p = Pattern.compile(".+\\s(.+)$");
    Matcher m = p.matcher(var);
    if(m.find()){
    if(m.group(1).contains(",")){
    String [] tokens = m.group(1).split(",");
    for(String token : tokens){
    result.add(token);
    }
    } else{
    result.add(m.group(1));
    }
    }
    } else{
    Pattern p = Pattern.compile(".+\\s(.+?)(;|=)");
    Matcher m = p.matcher(var);
    if(m.find()){
    if(m.group(1).contains(",")){
    String [] tokens = m.group(1).split(",");
    for(String token : tokens){
    result.add(token);
    }
    } else{
    result.add(m.group(1));
    }
    }
    }
    }
    return result;
    }
  3. 3

    Echar un vistazo a Checkstyle patrones de regex para convenciones de nomenclatura (tipos, métodos, paquetes, etc). Más info aquí.

  4. 3

    .*private\\s+(\\w*)\\s+(\\w*);

    el uso de este patrón. [a-z] es una letra minúscula, pero «Cadena» en el texto se inicia con mayúscula S. \\w es un carácter de palabra. Es el mismo que el [a-zA-Z0-9_]

    Parece que sus textos serán como "private <type> <field name>;" y si es así, su tipo puede contener letras mayúsculas letras minúsculas, números o subraya, por lo que escribir \\w es una buena solución.

    • una pequeña corrección: la segunda z en la definición de la \w debe ser superior caso 🙂
  5. 3

    Debe usar esta expresión:

    ^(?s)\\s*private\\s+(\\w+)\\s+(\\w+)\\s*;\\s*$

    Esto se asegurará de que coincidan con:

    • Mayúsculas y minúsculas coincidan con excepción de palabra clave private
    • De línea Multi declaraciones
    • espacios en blanco al inicio, final y en el medio
    • este (probablemente erróneamente) que coincida PRIVATE ...
    • Gracias actualizada la respuesta.

Dejar respuesta

Please enter your comment!
Please enter your name here