regex-Problem ( mit den Klassen Matcher / Pattern) --> XML prüfen

megachucky

Bekanntes Mitglied
Hallo.

Ich habe eine XML-Datei, z.B.

Code:
String request = "<soap:Envelope xmlns:soap='http://www.w3.org/2003/05/soap-envelope'><soap:Body><abc_zustand>blabla</soap:Body></soap:Envelope>";

Ich möchte alles bis zu inklusive "<soap:Body>" abschneiden und in einem String speichern. Allerdings ist das Body-Prefix natürlich nicht immer soap, daher ist hier eine Wildcard nötig.

Folgendes funktioniert solange ich "soap" statt Wildcard verwende:

Code:
Matcher getSoapBody     = Pattern.compile("<.*:Body>").matcher(request);

if(getSoapBody.find()) {
            String a = get2.group(0);
            System.out.println(a);
        }

Allerdings wird mit der Wildcard nun anscheinend auch das Body-Ende </soap:Body> gefunden und dadurch der ganze String gespeichert.

Kann mir bitte jemand erklären, wie ich es machen muss? Danke...
 

megachucky

Bekanntes Mitglied
Hallo zusammen,

vielen Dank schonmal. Aber leider wird trotzdem der String bis zu </soap:Body> abgeschnitten bei folgendem Code:

Code:
		Matcher get1     = Pattern.compile("<.*:Body>?").matcher(messageText);
        
        System.out.println(get1.toString());
        
        if(get1.find()) {
            String a = get1.group(0);
            System.out.println(a);
        }

Kann mir bitte jemand ein konkretes Beispiel nennen, wie es funktioniert?

Ich verstehe auch nicht, wieso get1.group(1) eine IndexArrayOutOfBounds schmeisst, hier müsste doch der erste Match kommen? Nur get1.group(0) funktioniert, und das gibt eben zuviel zurück.

Ich gebe zu, ich verstehe anscheinend das ganze Prinzip noch nicht, und werde mir die API nochmal genauer anschauen. Trotzdem wäre ich für ein konkretes Beispiel dankbar, in dem mein Problem gelöst wird.

Danke schonmal...
 

Ebenius

Top Contributor
Oh, also die Groups sind was anderes. Beispiel: Der reguläre Ausdruck [c](\w+) (\d+)[/c] matched auf eine Buchstabenkette, gefolgt von einem Leerzeichen, gefolgt von einer Nummernkette. Die Klammern bilden dabei Gruppen, von links nach rechts. Die Buchstabenkette ist die Gruppe eins, die Nummernkette ist die Gruppe zwei, der gesamte Ausdruck matched als Gruppe null. Wenn Du den zweiten Treffer des Ausdrucks finden willst, dann musst Du zweimal [c]find()[/c] aufrufen.

Wahrscheinlich sieht die Reg-Ex so in etwa aus: [c](?<=<(\w{1,255}):Body>).*?(?=</\1:Body>)[/c]

Aber XML mit Reg-Ex auseinander zu nehmen ist immer hässlich; besonders wenn man da nicht ganz sattelfest ist.

Ebenius
 
Zuletzt bearbeitet:

Ebenius

Top Contributor
Vorsicht, ich hab oben noch editiert.

Wahrscheinlich sieht die Reg-Ex so in etwa aus: [c](?<=<(\w{1,255}):Body>).*?(?=</\1:Body>)[/c]
Das erkläre ich vielleicht mal noch in Einzelteilen...
  • [c](?<=XYZ)[/c] bedeutet, dass links neben dem Match XYZ gefunden werden muss. XYZ liegt also direkt außerhalb, am linken Rand des Treffers (positive zero-width lookbehind).
  • [c].*?[/c] Das ist der eigentliche Treffer... Jede Anzahl von Zeichen, das Fragezeichen hinter dem Stern sorgt dafür, dass der kürzeste Treffer der alle anderen Bedingungen einhält gewinnt (reluctant zero or more chars).
  • [c](?=XYZ)[/c] Funktioniert wie der erste Punkt, aber rechts vom Treffer (positive zero-width lookahead).
  • [c]\1[/c] Ist eine Back-Reference. Oben ist die Gruppe eins so definiert: [c](\w{1,255})[/c], also eine Kette von Zeichen mit 1-255 Zeichen Länge. Die Back-Reference [c]\1[/c] verlangt nun, dass was auch immer als Gruppe eins gefunden wurde, da wieder genau so auftauchen muss. Damit würde in diesem String ein Treffer gefunden: [c]<soap:Body>Huhu</soap:Body>[/c], in diesem auch: [c]<a:Body>Huhu</a:Body>[/c], in diesem aber nicht: [c]<soap:Body>Huhu</a:Body>[/c].

HTH, Ebenius
 

megachucky

Bekanntes Mitglied
Vielen Dank für die Erläuterungen. Die API ist doch etwas schwer verständlich :)

Ich werde deine Reg-Ex mal testen. Prinzipiell muss ich auch nicht unbedingt Reg-Ex verwenden, ich habe aber keine andere Idee im Moment :-(

Anwendungsfall ist folgender: Ich bekomme eine SOAP-Request als String, schneide alles mit SOAP ab (also bis <s:Body> und ab </s:Body>) und speichere dies in Strings. Nach der Verarbeitung erhalte ich eine Antwort (ebenfalls wieder XML als String), hier füge ich dann die SOAP-Sachen wieder dran.

An Reg-Ex dachte ich eben, weil nicht bekannt ist, wie das Body-Prefix heißt, dafür benötige ich eine Wildcard.

Vielleicht gibts ja eine bessere Lösung als Reg-Ex für diesen Fall?
 
Zuletzt bearbeitet:

megachucky

Bekanntes Mitglied
Das erkläre ich vielleicht mal noch in Einzelteilen...

Wow, also dass das so kompliziert ist, war mir gar nicht bewusst. Mal schnell selbst ne Reg-Ex schreiben ist da wirklich nicht möglich :-(

Damit würde in diesem String ein Treffer gefunden: <soap:Body>Huhu</soap:Body> , in diesem auch: <a:Body>Huhu</a:Body> , in diesem aber nicht: <soap:Body>Huhu</a:Body> .

Ich glaube aber mein Problem löst das nicht, oder? Siehe mein Anwendungsfall im letzen Post. Ich möchte ja einfach alles bis zum <*:Body> abschneiden und in einem String speichern.
Deine Lösung prüft nun, ob die XML syntaktisch korrekt ist ?
 

Ebenius

Top Contributor
Deine Lösung prüft nun, ob die XML syntaktisch korrekt ist ?
Sie setzt das in gewissem Maße voraus. Aber sie matched auf alles zwischen [c]<soap:Body>[/c] und [c]</soap:Body>[/c]...

Probier's doch einfach aus:
Java:
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/** RegEx test */
public class RegExpTest {

  /** @param args ignored */
  public static void main(String[] args) {
    final String request =
          "<soap:Envelope "
                + "xmlns:soap='http://www.w3.org/2003/05/soap-envelope'>"
                + "<soap:Body><abc_zustand>blabla</soap:Body>"
                + "</soap:Envelope>";
    final String exp = "(?<=<(\\w{1,255}):Body>).*?(?=</\\1:Body>)";
    final Pattern patt = Pattern.compile(exp, Pattern.DOTALL);
    final Matcher matcher = patt.matcher(request);
    if (matcher.find()) {
      System.out.println(matcher.group());
    }
  }
}
Ausgabe:
Code:
<abc_zustand>blabla
BTW: Bitte im Forum für Java-Code [noparse]
Java:
[/noparse] Tags benutzen, nicht [noparse][code][/noparse]

Ebenius
 

megachucky

Bekanntes Mitglied
Ausgabe:
Code:

<abc_zustand>blabla

Hab es ausprobiert :) Leider löst es aber meine Fragestellung nicht, denn ich benötige wie oben (evtl. etwas unverständlich) geschrieben:

Code:
<soap:Envelope xmlns:soap='http://www.w3.org/2003/05/soap-envelope'><soap:Body>

Also das vor dem eigentlichen Inhalt. Dies schneide ich dann ab und speichere es (gleiches nachher natürlich noch für das "danach". Und den Rest, also den Inhalt
Code:
<abc_zustand>blabla
gebe ich dann zur Verarbeitung weiter.


Matchen möchte ich daher:
Code:
.*<.*:Body>
, nur dies funktioniert eben leider nicht wie gewünscht(vermutlich, da eben auch
Code:
*</soap:Body>
dafür passt. Auch das ?, um nur ein Ergebnis zu erhalten, hilft mir leider nicht.





Beim "danach", also
Code:
</.*:Body>.*
funktioniert es hingegen.


BTW: Bitte im Forum für Java-Code
Java:
 Tags benutzen, nicht [/QUOTE]

Ups, sorry. Werde ich in Zukunft machen...
 
Zuletzt bearbeitet:
K

karlheinz

Gast
Also suchst du in etwa sowas?

Java:
	    final String request =
	          "<soap:Envelope "
	                + "xmlns:soap='http://www.w3.org/2003/05/soap-envelope'>"
	                + "<soap:Body><abc_zustand>blabla</soap:Body>"
	                + "</soap:Envelope>";
	    final String exp =  "^(.*?<(\\w{1,255}):Body>).*(</\\2:Body>.*)$";
	    final Pattern patt = Pattern.compile(exp, Pattern.DOTALL);
	    final Matcher matcher = patt.matcher(request);
	    if (matcher.find()) {
	      System.out.println(matcher.group(1)); //Anfang
	      System.out.println(matcher.group(3)); //Ende
	    }

Ausgabe:
Code:
<soap:Envelope xmlns:soap='http://www.w3.org/2003/05/soap-envelope'><soap:Body>
</soap:Body></soap:Envelope>
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C RegEx Problem Java Basics - Anfänger-Themen 4
M Regex Erstellung Problem Java Basics - Anfänger-Themen 2
C Regex-Problem Java Basics - Anfänger-Themen 4
F Switch Case Problem mit Regex lösen? Java Basics - Anfänger-Themen 6
H regex-Problem Java Basics - Anfänger-Themen 2
F RegEx Problem Java Basics - Anfänger-Themen 8
G regex Verständnis Problem Java Basics - Anfänger-Themen 3
T Regex Problem Java Basics - Anfänger-Themen 4
H Problem mit Regex in Verbindung mit BufferedReader Java Basics - Anfänger-Themen 4
R Regex Problem Java Basics - Anfänger-Themen 3
J Problem mit regex Java Basics - Anfänger-Themen 2
A RegEx Problem mit slash ( / ) Java Basics - Anfänger-Themen 5
StrikeTom Problem mit regex(-anwendung) Java Basics - Anfänger-Themen 10
G einfaches Regex Problem Java Basics - Anfänger-Themen 4
F regex pattern problem Java Basics - Anfänger-Themen 4
S Regex Pattern Problem Java Basics - Anfänger-Themen 2
S Regex für Dezimalzahl. Problem mit Nachkommastellen Java Basics - Anfänger-Themen 5
K regex problem Java Basics - Anfänger-Themen 5
L Regex Problem Java Basics - Anfänger-Themen 3
D Regex greift nicht richtig Java Basics - Anfänger-Themen 4
B Regex Order unwichtig bei Lookaheads? Java Basics - Anfänger-Themen 7
F RegEx Hilfe Java Basics - Anfänger-Themen 5
R RegEx funktioniert nicht Java Basics - Anfänger-Themen 14
B Regex Ausdrücke für Monate Java Basics - Anfänger-Themen 7
W RegEx Java Basics - Anfänger-Themen 4
K REGEX - Rechnungsbetrag wird nicht richtig ausgelesen. Java Basics - Anfänger-Themen 3
X Wie kann man ein Regex erstellen, die 8-Bit-Binär-Zahlen darstellen. Java Basics - Anfänger-Themen 1
A Zusammengesetzte Nomen/Straßennamen mit Regex-Ausdrücken trennen Java Basics - Anfänger-Themen 8
Fodoboo131 RegEx- Umwandlung von String in ausführbares Objekt/ Befehl Java Basics - Anfänger-Themen 9
H Java Regex Aufzählung kontrollieren Java Basics - Anfänger-Themen 3
Nooobi Regex und .matches() geben keine Ausnahme Java Basics - Anfänger-Themen 10
sserio Split() -> Regex Frage. Java Basics - Anfänger-Themen 7
K Wie verneine ich einen Regex? Java Basics - Anfänger-Themen 2
L Hilfe bei RegEx Java Basics - Anfänger-Themen 4
Dimax RegEx Java Basics - Anfänger-Themen 10
P Einfacher regulärer Ausdruck (RegEx) für E-Mail-Adressen Java Basics - Anfänger-Themen 2
O Regex bei ReplaceAll ersetzt Wort und Sonderzeichen nicht. Java Basics - Anfänger-Themen 9
O Text mit Regex trennen und wieder zusammenbauen Java Basics - Anfänger-Themen 5
L Regex issue Java Basics - Anfänger-Themen 4
B Regex Kombination benötigt Java Basics - Anfänger-Themen 5
strohkolben Regex Java Basics - Anfänger-Themen 3
OnDemand Regex oder Split? Java Basics - Anfänger-Themen 5
I String.split regex Frage Java Basics - Anfänger-Themen 2
Dimax RegEx funktionieren nicht Java Basics - Anfänger-Themen 7
M Regex nur Zahlen und Punkt zulassen, Keine Eingabe(Leeres TextFeld) nicht zulassen Java Basics - Anfänger-Themen 6
K substitute mit regex Java Basics - Anfänger-Themen 10
G RegEx Java Basics - Anfänger-Themen 11
M Regex Probleme (mal wieder) Java Basics - Anfänger-Themen 3
M Regex zum Integer.parseInt Java Basics - Anfänger-Themen 4
G Regex Java Basics - Anfänger-Themen 4
M Regex-Ausdruck: Alle Zeichen bis auf ein bestimmtes erlauben (p{L}) Java Basics - Anfänger-Themen 5
M Regex anpassen Java Basics - Anfänger-Themen 19
M Regex für bestimmte Wörter bzw. bestimmte Zeichen erstellen Java Basics - Anfänger-Themen 5
C Positive und negative Zahlen mit Regex extrahieren Java Basics - Anfänger-Themen 8
F RegEx für Email Java Basics - Anfänger-Themen 2
F RegEx "+" nur als Zeichen, nicht als Operator oder Sonstiges Java Basics - Anfänger-Themen 2
FelixN RegEx aus einem String als String-Array zurückgeben Java Basics - Anfänger-Themen 8
FelixN RegEx Erläuterung "ˆ[ˆa-zA-Z]+$" Java Basics - Anfänger-Themen 6
F Regex Hilfe Java Basics - Anfänger-Themen 3
I Regex findet keine Treffer Java Basics - Anfänger-Themen 4
C Regex Java Basics - Anfänger-Themen 2
C Probleme bei Regex Java Basics - Anfänger-Themen 9
B Regex ignorieren von Groß - Kleinschreibung Java Basics - Anfänger-Themen 1
F Regex für Inlineformatierungen Java Basics - Anfänger-Themen 12
W Einfachen, ein beliebiges Zeichen oft erkennenden Regex Parser selber schreiben - wie vorgehen? Java Basics - Anfänger-Themen 12
O Regex Java Basics - Anfänger-Themen 2
F Ist das ein korrekter Regex-Ausdruck? Java Basics - Anfänger-Themen 12
M Zahlenbereich mit RegEx Java Basics - Anfänger-Themen 3
B Hilfe bei Regex - Erstellung Java Basics - Anfänger-Themen 5
D regex Aufbau Frage Java Basics - Anfänger-Themen 4
W RegEx Matcher + Pattern und Emails Java Basics - Anfänger-Themen 8
R Rechenzeichen als regex Java Basics - Anfänger-Themen 10
S Ich verstehe die RegEx Tabelle von Javadoc nicht so ganz Java Basics - Anfänger-Themen 3
C Erste Schritte Regex - Datei einlesen und splitten Java Basics - Anfänger-Themen 4
F Regex Hilfe Java Basics - Anfänger-Themen 14
G String nach Contains/Regex Java Basics - Anfänger-Themen 2
U RegEx alle Kommas bei den Zahlen in Punkt umwandeln Java Basics - Anfänger-Themen 3
K RegEx - Multiple Line Java Basics - Anfänger-Themen 3
S Regex Pattern Java Basics - Anfänger-Themen 3
K Regex: illegal character range Java Basics - Anfänger-Themen 4
F RegEX Hilfe Java Basics - Anfänger-Themen 8
U Regex für kommaseparierte Zahlen Java Basics - Anfänger-Themen 1
K Operatoren Regex für 10er Zahlen Java Basics - Anfänger-Themen 8
V Java Regex richtig parsen Java Basics - Anfänger-Themen 2
E Brauche eine Antwort zum Thema RegEx ( Alternative zur Lösung auch gesucht ) Java Basics - Anfänger-Themen 5
N mein RegEx Java Basics - Anfänger-Themen 2
C Lösung für RegEx in Java gesucht Java Basics - Anfänger-Themen 2
B Java - Reguläre Ausdrücke - RegEx oder Regular Expressions - Eckige Klammern Java Basics - Anfänger-Themen 2
M Regex/matcher Java Basics - Anfänger-Themen 2
T Methoden String.matches() - Regex Java Basics - Anfänger-Themen 2
truesoul Regex für www Java Basics - Anfänger-Themen 0
N Methoden Straßennamen und Hausnummer - RegEx Java Basics - Anfänger-Themen 19
W Erste Schritte Regex negieren Java Basics - Anfänger-Themen 3
W String match mit Wildcard ODER Regex Java Basics - Anfänger-Themen 1
E useDelimiter-Anwednung / Regex Java Basics - Anfänger-Themen 2
C java regex Java Basics - Anfänger-Themen 2
C Regex zum matchen ausserhalb von Tags Java Basics - Anfänger-Themen 3
O Regex zwischenspeichern Java Basics - Anfänger-Themen 6
O Regex Java Basics - Anfänger-Themen 5
R Einfacher Regex Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben