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.
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ícitamentePattern.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>");
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.
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
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
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