199 votes

Java ; Remplacer une chaîne de caractères (projet scolaire) ?

Dans le cadre d'un projet scolaire, je dois remplacer une chaîne de caractères à partir du formulaire :

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

à quelque chose comme :

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

Je pense que cela peut être fait avec des expressions régulières, mais je ne sais pas encore comment le faire.

Pouvez-vous me donner un coup de main ?

P.S. La mission actuelle est d'implémenter une application Java de traitement des polynômes, et je l'utilise pour passer polynomial.toString() du modèle à la vue, et je veux l'afficher en utilisant des balises html d'une manière attrayante.

10voto

Lieven Keersmaekers Points 32396
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
}

3voto

Michael Myers Points 82361

S'il s'agit d'une expression mathématique générale et que les expressions parenthétiques sont autorisées, il sera très difficile (voire impossible) de le faire avec des expressions régulières.

Si les seuls remplacements sont ceux que vous avez montrés, ce n'est pas si difficile à faire. Premier déshabillage * puis utiliser la capture comme l'a montré Can Berk Güder pour gérer les ^ 's.

3voto

Adam Jaskiewicz Points 7485

Quel est votre polynôme ? Si vous le "traitez", j'imagine une sorte d'arbre de sous-expressions généré à un moment donné, et je pense qu'il serait beaucoup plus simple de l'utiliser pour générer votre chaîne de caractères que de ré-analyser l'expression brute à l'aide d'une regex.

Il s'agit simplement d'une autre façon de penser. Je ne sais pas ce qui se passe d'autre dans votre application.

1voto

cdmckay Points 11234

Essayez ceci :

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

Veillez à importer java.util.regex.

1voto

Greg Points 22
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);
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X