Java; Reemplazo de cadena (proyecto escolar)?

6 minutos de lectura

Avatar de usuario de Dan Burzo
dan burzo

Como parte de un proyecto para la escuela, necesito reemplazar una cadena del formulario:

5 * x^3 - 6 * x^1 + 1

a algo como:

5x<sup>3</sup> - 6x<sup>1</sup> + 1

Creo que esto se puede hacer con expresiones regulares, pero aún no sé cómo hacerlo.

¿Puedes echarme una mano?

PD: la tarea real es implementar una aplicación Java de procesamiento polinomial, y estoy usando esto para pasar polynomial.toString() del modelo a la vista, y quiero mostrarlo usando etiquetas html de una manera bonita.

  • Tenga en cuenta que este es un proyecto escolar, y la mayoría de las respuestas omitieron colapsar el “5 * x” a “5x”. Es decir, la pregunta en realidad no es sobre el reemplazo de cadenas, sino que la tarea real es implementar una aplicación Java de procesamiento polinomial.

    – xpt

    hace 2 días

Avatar de usuario de Can Berk Güder
Can Berk Güder

str.replaceAll("\\^([0-9]+)", "<sup>$1</sup>");

  • ah… pero te faltó colapsar el “5*x” a “5x”

    – James Curran

    10 de marzo de 2009 a las 20:53

  • Problemas de pareja: \^ debe ser \\^ y $ debe ser \$.

    – cdmckay

    10 de marzo de 2009 a las 21:00

  • Sigo recibiendo el error “secuencia de escape no válida”… ¿me estoy perdiendo algo?

    – Dan Burzo

    10 de marzo de 2009 a las 21:03

  • esto me da un error en el segundo parámetro: str.replaceAll(“\\^([0-9]+)”, “\$1“); no lo entiendo… 🙁

    – Dan Burzo

    10 de marzo de 2009 a las 21:10

  • ¿Es posible usar un patrón precompilado? Esto podría ser útil si reemplaza All con la misma expresión regular muchas veces.

    – qed

    5 de noviembre de 2014 a las 20:35

private String removeScript(String content) {
    Pattern p = Pattern.compile("<script[^>]*>(.*?)</script>",
            Pattern.DOTALL | Pattern.CASE_INSENSITIVE);
    return p.matcher(content).replaceAll("");
}

  • Este es el mejor IMO, porque usa un Regex compilado, pero el objeto Pattern debe ser un objeto estático.

    –Marcel Valdez Orozco

    27 mayo 2016 a las 15:42


  • Lo divertido es que el replaceAll método hace implícitamente Pattern.compile(regex).matcher(testString).replaceAll(regexReplacementString)! Por lo tanto, si reutiliza el patrón de esta manera, se evitarán los objetos redundantes. Además, como dice @MarcelValdezOrozco, hacerlo estático evitará invocaciones innecesarias de compilación de patrones. 🙂

    – varun

    30 de agosto de 2019 a las 18:18

String input = "hello I'm a java dev" +
"no job experience needed" +
"senior software engineer" +
"java job available for senior software engineer";

String fixedInput = input.replaceAll("(java|job|senior)", "<b>$1</b>");

avatar de usuario de vit123
vit123

"5 * x^3 - 6 * x^1 + 1".replaceAll("\\W*\\*\\W*","").replaceAll("\\^(\\d+)","<sup>$1</sup>");

tenga en cuenta que unir ambos reemplazos en una sola expresión regular/reemplazo sería una mala elección porque expresiones más generales como x^3 - 6 * x fallaría.

Avatar de usuario de Lieven Keersmaekers
Lieven Keersmaekers

import java.util.regex.PatternSyntaxException;

// (:?\d+) \* x\^(:?\d+)
// 
// Options: ^ and $ match at line breaks
// 
// Match the regular expression below and capture its match into backreference number 1 «(:?\d+)»
//    Match the character “:” literally «:?»
//       Between zero and one times, as many times as possible, giving back as needed (greedy) «?»
//    Match a single digit 0..9 «\d+»
//       Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
// Match the character “ ” literally « »
// Match the character “*” literally «\*»
// Match the characters “ x” literally « x»
// Match the character “^” literally «\^»
// Match the regular expression below and capture its match into backreference number 2 «(:?\d+)»
//    Match the character “:” literally «:?»
//       Between zero and one times, as many times as possible, giving back as needed (greedy) «?»
//    Match a single digit 0..9 «\d+»
//       Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
try {
    String resultString = subjectString.replaceAll("(?m)(:?\\d+) \\* x\\^(:?\\d+)", "$1x<sup>$2</sup>");
} catch (PatternSyntaxException ex) {
    // Syntax error in the regular expression
} catch (IllegalArgumentException ex) {
    // Syntax error in the replacement text (unescaped $ signs?)
} catch (IndexOutOfBoundsException ex) {
    // Non-existent backreference used the replacement text
}

  • @Dan: ¡Asegúrate de entender lo que está haciendo la expresión regular! Las expresiones regulares son peligrosas en manos de personas que casi conocerlos. (De ahí la cita que publiqué).

    – Michael Myers

    10 de marzo de 2009 a las 21:13

  • @Dan, tal como está, la expresión regular espera un espacio delante y después de cada archivo *. Esto se puede resolver en la expresión regular, pero dejemos eso como un ejercicio.

    –Lieven Keersmaekers

    10 de marzo de 2009 a las 21:13

  • @Dan. Cambié un poco la expresión regular después de crear los comentarios. El original era: (:?\d+) * x\^(:?\d) El nuevo es: (:?\d+) * x\^(:?\d+)

    –Lieven Keersmaekers

    10 de marzo de 2009 a las 21:19

Si esto es para cualquier expresión matemática general y se permiten expresiones entre paréntesis, será muy difícil (quizás imposible) hacer esto con expresiones regulares.

Si los únicos reemplazos son los que mostró, no es tan difícil de hacer. Primera tira *‘s, luego use la captura como Can Berk Güder mostró para manejar el ^‘s.

  • @Dan: ¡Asegúrate de entender lo que está haciendo la expresión regular! Las expresiones regulares son peligrosas en manos de personas que casi conocerlos. (De ahí la cita que publiqué).

    – Michael Myers

    10 de marzo de 2009 a las 21:13

  • @Dan, tal como está, la expresión regular espera un espacio delante y después de cada archivo *. Esto se puede resolver en la expresión regular, pero dejemos eso como un ejercicio.

    –Lieven Keersmaekers

    10 de marzo de 2009 a las 21:13

  • @Dan. Cambié un poco la expresión regular después de crear los comentarios. El original era: (:?\d+) * x\^(:?\d) El nuevo es: (:?\d+) * x\^(:?\d+)

    –Lieven Keersmaekers

    10 de marzo de 2009 a las 21:19

Avatar de usuario de Adam Jaskiewicz
adam jaskiewicz

¿Cuál es tu polinomio? Si lo está “procesando”, imagino que se generará algún tipo de árbol de subexpresiones en algún momento, y pensaría que sería mucho más simple usar eso para generar su cadena que volver a analizar el crudo expresión con una expresión regular.

Simplemente lanzando una forma diferente de pensar por ahí. No estoy seguro de qué más está pasando en su aplicación.

  • Entiendo lo que dices… eso me ahorraría mucho sufrimiento, pero estoy tratando de mantener las cosas separadas. Quería que Polynomial fuera una clase independiente que se pudiera usar en otro contexto, como la consola… pero mi enfoque podría ser incorrecto. ¿Qué piensas?

    – Dan Burzo

    10 de marzo de 2009 a las 21:07

  • Veo a que te refieres. La incorporación de las etiquetas html en Polynomial.toString() definitivamente está rompiendo MVC. Sin embargo, creo que todavía haría algo así, porque realmente haría las cosas más fáciles. Quizás toHtmlString() o algo así…

    – Adam Jaskiewicz

    10 de marzo de 2009 a las 21:11

  • ¿O tal vez una clase separada que View usa específicamente para formatear el polinomio? Entonces, la clase Polynomial en sí misma no necesita saber nada sobre el formato.

    – Hermes

    10 de marzo de 2009 a las 21:20

  • hice un nuevo método: toHTML(); cuando lo piensas, toString() y toHTML() son básicamente lo mismo conceptualmente, excepto que emplean reglas diferentes para formatear;

    – Dan Burzo

    10 de marzo de 2009 a las 21:26

  • Sí, no me gusta mucho que el formato específico de la vista sea en el objeto, pero le permitiría usar el polimorfismo para manejar gran parte de la lógica en lugar de una declaración de cambio gigante en un método de utilidad estática. Cuando se trata de eso, toString() también es un formato específico de vista…

    – Adam Jaskiewicz

    10 de marzo de 2009 a las 21:48

¿Ha sido útil esta solución?