2016-10-30 4 views
0

Wenn ich schreibe: "integralfrom1to10ofx^2) + integralfrom1to10ofx^3)",Java RegexMuster overmatching (Muster entspricht einer Sequenz statt zwei)

Ich erwarte, dass meine regex:

// INTEGRAL BASIC 
Pattern integralFinalPattern = Pattern.compile("integralfrom(.*)to(.*)of(.*)\\)"); 
Matcher integralFinalMatcher = integralFinalPattern.matcher(regexDedicatedString); 
if(integralFinalMatcher.find()){ 
    String integral_user_input = integralFinalMatcher.group(0); 
    String integral_lower_index = integralFinalMatcher.group(1); 
    String integral_upper_index = integralFinalMatcher.group(2); 
    String integral_formula = integralFinalMatcher.group(3); 
    String ultimateLatexIntegral = "(\\int_{"+ integral_lower_index 
       +"}^{"+ integral_upper_index +"} " + integral_formula + ")"; 

    mathFormula = mathFormula.replace(integral_user_input, ultimateLatexIntegral); 
} 

übereinstimmen diese zwei Saiten getrennt, aber für jetzt würde es es als eins interpretieren. in Folge davon Und ich würde die folgende Latex SVG erhalten: Sample picture of wrong regex interpretation

I-Ausgang mit zwei separaten Integralen haben möchte, hier wie haben: Desired regex interpretation Wie ich dies mit regex erreichen kann?

Offensichtlich suche ich nach einer Idee, die es für mehr als zwei Stücke arbeiten lassen würde.

+4

Bitte Code-Boxen verwenden und keine Bilder Code und Eingabe/Ausgabe darzustellen. –

+0

[Entmutigen Screenshots von Code und/oder Fehlern] (http://meta.stackoverflow.com/q/303812/995714) –

+0

Verwenden Sie nicht gierige Quantifizierer: '(. *?)' Anstelle von '(. *)' . –

Antwort

0

Sie machen eine Menge Arbeit, die die Matcher-Klasse für Sie leisten kann. Check it out:

Pattern p = Pattern.compile("integralfrom(?<upper>.*?)to(?<lower>.*?)of(?<formula>.*?)\\)"); 
Matcher m = p.matcher(subject); 
result = m.replaceAll("\\\\int_{${upper}}^{${lower}} (${formula})"); 

Mit einem Eingang "integralfrom1to10ofx^2)+integralfrom1to10ofx^3)", ist das Ergebnis:

\int_{1}^{10} (x^2)+\int_{1}^{10} (x^3) 
+0

Danke für die saubere Lösung! Gibt es einen effizienten Weg, um diese Regex noch teilweise zu ersetzen, ich meine, wenn wir zum Beispiel "integralfrom1" schreiben, ersetzt das obige Regex-Snippet es durch \ int_ {1}^{}()? Oder muss ich getrennte Muster schreiben? –

+0

Info für Android-Entwickler: Named Regex-Gruppen werden noch nicht von Android-Code-Basis unterstützt, also musste ich eine der 3rd-Party-Bibliotheken verwenden: https://github.com/tony19/named-regexp#download. –

+0

** Kommentar 1: ** Sie müssten verschiedene Regexes verwenden oder, noch besser, einen dedizierten Parser schreiben. ** Kommentar 2: ** Sie könnten auch nicht benannte Gruppen verwenden, wie Sie es ursprünglich gemacht haben, und nummerierte Rückwärtsreferenzen: '" \\\\ int _ {$ 1}^{$ 2} ($ 3) "' –