Pedido
Visto502k veces
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 todavía no sé cómo hacerlo.
Me puedes echar 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.
4
str.replaceAll("\^([0-9]+)", "<sup>$1</sup>");
10
private String removeScript(String content) {
Pattern p = Pattern.compile("<script[^>]*>(.*?)</script>",
Pattern.DOTALL | Pattern.CASE_INSENSITIVE);
return p.matcher(content).replaceAll("");
}
2
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>");
"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.
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
}
3
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.
2
¿Cuál es tu polinomio? Si lo está «procesando», estoy imaginando algún tipo de árbol de subexpresiones que se generará en algún momento, y pensaría que sería mucho más sencillo usarlo para generar su cadena que volver a analizar el crudo. expresión con una expresión regular.
Simplemente lanzando una forma diferente de pensar. No estoy seguro de qué más está sucediendo en su aplicación.
5
Prueba esto:
String str = "5 * x^3 - 6 * x^1 + 1";
String replacedStr = str.replaceAll("\^(\d+)", "<sup>$1</sup>");
Asegúrese de importar java.util.regex.
3
class Replacement
{
public static void main(String args[])
{
String Main = "5 * x^3 - 6 * x^1 + 1";
String replaced = Main.replaceAll("(?m)(:?\d+) \* x\^(:?\d+)", "$1x<sup>$2</sup>");
System.out.println(replaced);
}
}
Querrá considerar la captura en expresiones regulares para manejar el ajuste de 3 en ^ 3.
Pruebe esto, puede que no sea la mejor manera. pero funciona
String str = "5 * x^3 - 6 * x^1 + 1";
str = str.replaceAll("(?x)(\d+)(\s+?\*?\s+?)(\w+?)(\^+?)(\d+?)", "$1$3<sup>$5</sup>");
System.out.println(str);
2
Eche un vistazo a antlr4. Le llevará mucho más lejos en la creación de una estructura de árbol que las expresiones regulares por sí solas.
https://github.com/antlr/grammars-v4/tree/master/calculator (calculator.g4 contiene la gramática que necesita)
En pocas palabras, define la gramática para analizar una expresión, usa antlr para generar código java y agrega devoluciones de llamada para manejar la evaluación cuando se está construyendo el árbol.
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas java regex o haga su propia pregunta.
lang-java