Java; String ersetzen (Schulprojekt)?

Lesezeit: 6 Minuten

Dans Benutzeravatar
Dan

Als Teil eines Projekts für die Schule muss ich eine Zeichenfolge aus dem Formular ersetzen:

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

zu etwas wie:

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

Ich glaube, dass dies mit regulären Ausdrücken möglich ist, aber ich weiß noch nicht, wie es geht.

Können Sie mir zur Hand gehen?

PS Die eigentliche Aufgabe besteht darin, eine Polynomial Processing Java-Anwendung zu implementieren, und ich verwende diese, um polynomial.toString() vom Modell an die Ansicht zu übergeben, und ich möchte es auf hübsche Weise mit HTML-Tags anzeigen.

  • Beachten Sie, dass dies ein Schulprojekt ist und die meisten Antworten das Reduzieren von “5 * x” auf “5x” verpasst haben. Dh es geht eigentlich nicht um die String-Ersetzung, sondern die eigentliche Aufgabe ist die Implementierung einer Polynomial Processing Java-Anwendung.

    – xpt

    15. Dezember um 15:24 Uhr

Benutzeravatar von Can Berk Güder
Kann Berk Güder

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

  • ah … aber Sie haben es verpasst, “5 * x” auf “5x” zu reduzieren

    – James Curran

    10. März 2009 um 20:53 Uhr

  • Paar Probleme: \^ muss \\^ sein und $ muss \$ sein.

    – cdmckay

    10. März 2009 um 21:00 Uhr

  • Immer noch Fehlermeldung “ungültige Escape-Sequenz” … fehlt mir etwas?

    – Dan

    10. März 2009 um 21:03 Uhr

  • Dies gibt mir einen Fehler beim zweiten Parameter: str.replaceAll(“\\^([0-9]+)”, “\$1“); Ich verstehe es nicht… 🙁

    – Dan

    10. März 2009 um 21:10 Uhr

  • Ist es möglich, ein vorkompiliertes Muster zu verwenden? Dies kann nützlich sein, wenn Sie replaceAll viele Male mit demselben regulären Ausdruck ausführen.

    – qd

    5. November 2014 um 20:35 Uhr

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

  • Dies ist meiner Meinung nach das beste, da es einen kompilierten Regex verwendet, aber das Pattern-Objekt sollte ein statisches Objekt sein.

    – Marcel Valdez Orozco

    27. Mai 2016 um 15:42 Uhr


  • Lustige Sache ist, dass die replaceAll Methode implizit tut Pattern.compile(regex).matcher(testString).replaceAll(regexReplacementString)! Wenn Sie also das Muster auf diese Weise wiederverwenden, werden redundante Objekte vermieden. Wie @MarcelValdezOrozco sagt, werden unnötige Musterkompilierungsaufrufe vermieden, wenn Sie es statisch machen. 🙂

    – Varun

    30. August 2019 um 18:18 Uhr

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>");

Benutzeravatar von vit123
vit123

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

Bitte beachten Sie, dass das Verbinden beider Ersetzungen in einer einzigen Regex/Ersetzung eine schlechte Wahl wäre, da allgemeinere Ausdrücke wie z x^3 - 6 * x würde versagen.

Benutzeravatar von 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: Stellen Sie sicher, dass Sie verstehen, was die Regex tut! Regexe sind gefährlich in den Händen von Leuten, die fast kenne sie. (Daher das Zitat, das ich gepostet habe.)

    – Michael myers

    10. März 2009 um 21:13 Uhr

  • @Dan, so wie es aussieht, erwartet die Regex ein Leerzeichen vor und nach jedem *. Dies kann in der Regex gelöst werden, aber lassen wir das als Übung.

    – Lieven Keersmaekers

    10. März 2009 um 21:13 Uhr

  • @Dan. Ich habe die Regex ein wenig geändert, nachdem ich die Kommentare erstellt hatte. Original war: (:?\d+) * x\^(:?\d) Neu ist: (:?\d+) * x\^(:?\d+)

    – Lieven Keersmaekers

    10. März 2009 um 21:19 Uhr

Wenn dies für einen allgemeinen mathematischen Ausdruck gilt und Klammerausdrücke erlaubt sind, wird es sehr schwierig (möglicherweise unmöglich) sein, dies mit regulären Ausdrücken zu tun.

Wenn die einzigen Ersetzungen die sind, die Sie gezeigt haben, ist das nicht so schwer. Erstmal ausziehen *‘s, dann verwenden Sie Capturing wie Can Berk Güder gezeigt hat, um mit dem umzugehen ^‘s.

  • @Dan: Stellen Sie sicher, dass Sie verstehen, was die Regex tut! Regexe sind gefährlich in den Händen von Leuten, die fast kenne sie. (Daher das Zitat, das ich gepostet habe.)

    – Michael myers

    10. März 2009 um 21:13 Uhr

  • @Dan, so wie es aussieht, erwartet die Regex ein Leerzeichen vor und nach jedem *. Dies kann in der Regex gelöst werden, aber lassen wir das als Übung.

    – Lieven Keersmaekers

    10. März 2009 um 21:13 Uhr

  • @Dan. Ich habe die Regex ein wenig geändert, nachdem ich die Kommentare erstellt hatte. Original war: (:?\d+) * x\^(:?\d) Neu ist: (:?\d+) * x\^(:?\d+)

    – Lieven Keersmaekers

    10. März 2009 um 21:19 Uhr

Benutzeravatar von Adam Jaskiewicz
Adam Jaskiewicz

Was ist dein Polynom? Wenn Sie es “verarbeiten”, stelle ich mir eine Art Baum von Unterausdrücken vor, die irgendwann generiert werden, und würde denken, dass es viel einfacher wäre, dies zum Generieren Ihrer Zeichenfolge zu verwenden, als das Rohmaterial erneut zu analysieren Ausdruck mit einer Regex.

Wirf einfach eine andere Denkweise raus. Ich bin mir nicht sicher, was sonst noch in Ihrer App vor sich geht.

  • Ich verstehe, was Sie sagen… das würde mir zwar viel Leid ersparen, aber ich versuche, die Dinge getrennt zu halten. Ich wollte, dass Polynomial eine eigenständige Klasse ist, die in einem anderen Kontext verwendet werden kann, z. B. in der Konsole … aber mein Ansatz könnte falsch sein. Was denken Sie?

    – Dan

    10. März 2009 um 21:07 Uhr

  • Ich verstehe was du meinst. Das Einfügen der HTML-Tags in Polynomial.toString() bricht definitiv MVC. Ich denke, ich würde so etwas trotzdem machen, weil es die Dinge wirklich einfacher machen würde. Vielleicht toHtmlString() oder so …

    – Adam Jaskiewicz

    10. März 2009 um 21:11 Uhr

  • Oder vielleicht eine separate Klasse, die die Ansicht speziell zum Formatieren des Polynoms verwendet? Dann braucht die Polynomial-Klasse selbst nichts über die Formatierung zu wissen.

    – Hermes

    10. März 2009 um 21:20 Uhr

  • Ich habe eine neue Methode erstellt: toHTML(); Wenn Sie darüber nachdenken, sind toString() und toHTML() konzeptionell im Grunde dasselbe, außer dass sie unterschiedliche Regeln für die Formatierung verwenden;

    – Dan

    10. März 2009 um 21:26 Uhr

  • Ja, ich mag nicht wirklich, dass die ansichtsspezifische Formatierung ist in das Objekt, aber es würde Ihnen erlauben, Polymorphismus zu verwenden, um mit einem Großteil der Logik umzugehen, anstatt eine riesige switch-Anweisung in einer statischen Hilfsmethode. Genau genommen ist toString() auch eine ansichtsspezifische Formatierung …

    – Adam Jaskiewicz

    10. März 2009 um 21:48 Uhr

1436850cookie-checkJava; String ersetzen (Schulprojekt)?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy