Ver Mensaje Individual
  #5 (permalink)  
Antiguo 28/03/2013, 10:25
zant95
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Duda con expresiones regulares

Veamos, teniendo la siguiente string:
/sudoif $hand(nombre_de_jugador)==3 comando_que_se_aplica_si_se_cumple_la_condición
Nota: no tiene por qué ser $hand, sino cualquier otro como $exp. Aunque siempre siguiendo el patrón: $*(*).

Necesito separar y tener dos variables que sean "hand" y "nombre_de_jugador" para así poder reemplazar "$hand(nombre_de_jugador)" por el valor correspondiente a "Integer.toString(nombre_de_jugador.getItemInHand() .getTypeId())".

Hay que tener en cuenta que un mismo string puede contener varios "$*(*)" donde el nombre del jugador cambie e incluso la "variable principal" cambie.

Por ejemplo:
/sudoif $exp(nombre_de_jugador_1)>$exp(nombre_de_jugador_2 ) comando_que_se_aplica_si_se_cumple_la_condición
/sudoif $food(nombre_de_jugador_2)>10 comando_que_se_aplica_si_se_cumple_la_condición

Ahí es donde tengo que saber si es "$exp(*)" por ejemplo para reemplazar por "Integer.toString(*.getTotalExperience())" o si es "$food(*)" para en ese caso reemplazar por "Integer.toString(*.getFoodLevel())".

No sé si ahora me he explicado correctamente con el asunto del problema.
Saludos!

##############################################

EDITO:

He solucionado parcialmente el problema haciendo esto:
Código:
  public String variables(String string) {
    Calendar calendar = Calendar.getInstance();
    return string.replaceAll("\\$gamemode\\((.+?)\\)", Bukkit.getServer().getPlayer("$1").getGameMode().name())
            .replaceAll("\\$world\\((.+?)\\)", Bukkit.getServer().getPlayer("$1").getWorld().getName())
            .replaceAll("\\$food\\((.+?)\\)", Integer.toString(Bukkit.getServer().getPlayer("$1").getFoodLevel()))
            .replaceAll("\\$health\\((.+?)\\)", Integer.toString(Bukkit.getServer().getPlayer("$1").getHealth()))
            .replaceAll("\\$exp\\((.+?)\\)", Integer.toString(Bukkit.getServer().getPlayer("$1").getTotalExperience()))
            .replaceAll("\\$amount\\((.+?)\\)", Integer.toString(Bukkit.getServer().getPlayer("$1").getItemInHand().getTypeId()))
            .replaceAll("\\$mctime\\((.+?)\\)", Integer.toString(Bukkit.getServer().getPlayer("$1").getItemInHand().getAmount()))
            .replace("$hour", Integer.toString(calendar.get(Calendar.HOUR_OF_DAY)))
            .replace("$min", Integer.toString(calendar.get(Calendar.MINUTE)))
            .replace("$sec", Integer.toString(calendar.get(Calendar.SECOND)))
            .replace("$year", Integer.toString(calendar.get(Calendar.YEAR)))
            .replace("$month", Integer.toString(calendar.get(Calendar.MONTH)+1))
            .replace("$day", Integer.toString(calendar.get(Calendar.DAY_OF_MONTH)));
  }
El problema es que ahora "$1" no lo reemplaza por el nombre del usuario, sino que se queda simplemente en "$1". Sin embargo si hago esto:
Código:
.replaceAll("\\$gamemode\\((.+?)\\)",  "$1")
Sí obtengo lo que necesito.

¿Alguna idea sobre cómo podría solventar esto?

Última edición por zant95; 28/03/2013 a las 12:17