Regex Pattern Problem

Status
Nicht offen für weitere Antworten.
J

JavaRegexer

Gast
Hallo,

ich möchte mich mal etwas näher mit den Java Pattern beschäftigen und habe mir ein kleines Beispiel
Programm geschrieben.
Nur habe ich hier schon ein Problem welches ich nicht verstehe.

Ich habe in einem String folgendes gespeichert:

Code:
menu ic_menu
{
	titel : "Information Center"
	label:	"Information Center"


	items
	{
		call personenkontoliste_pro_jahr,
		call personenkontoliste_pro_periode,
		goto	mehr_reports,
		goto	Azubi_reports,
		call personenkontosaldo,
		call ao_stammdatenreport,
		call notepad
	}


	buttons
	{
		fct1 $(hauptmenue) mainmen,
		fct2 $(verlassen) leave
	}

	entrycode
	{
		$(fk_mandant) = mand_nr();
	}
}

menu	Azubi_reports
{
	titel:	"Azubi Reports"
	label:	"Azubi Übungen"

	items
	{
		call uebneu,
		call uebruet,
		goto megaeat
	}
	buttons
	{
		fct1	$(hauptmenue)	mainmen,
		fct2	$(verlassen)	leave
	}
}


menu	megaeat
{
	titel:	"Essensverwaltung MegaPlus"
	label:	"Essensverwaltung MegaPlus"

	items
	{
		call megaeat_mitarb,
		call megaeat_bestell,
		call megaeat_print
	}
	buttons
	{
		fct1	$(hauptmenue)	mainmen,
		fct2	$(verlassen)	leave
	}
}

menu	mehr_reports
{
	titel:	"Noch mehr Reports"
	label:	"Viele Weitere"

	items
	{
		call uebneu,
		call uebruet
	}
	buttons
	{
		fct1	$(hauptmenue)	mainmen,
		fct2	$(verlassen)	leave
	}
}


ACTION personenkontoliste_pro_jahr "Personenkontoliste pro Jahr Mandant: $(fk_mandant)"
	exec "Viewer.exe" "EXTERNAL#TemplateName=Reports/K/PersonenkontenInformation/Personenkontoliste pro Jahr.xml\; Provider=Oracle Provider for OLE DB\; Server=$(ic_server)\; Database=$(ic_db)$(fk_mandant)\; Userid=$(ic_id)$(fk_mandant); Language=1033\;";

ACTION personenkontoliste_pro_periode "Personenkontoliste pro Periode"
	exec "Viewer.exe" "EXTERNAL#TemplateName=Reports/K/PersonenkontenInformation/Personenkontoliste pro Periode.xml\; Provider=Oracle Provider for OLE DB\; Server=$(ic_server)\; Database=$(ic_db)$(fk_mandant)\; Userid=$(ic_id)$(fk_mandant); Language=1033\;";

ACTION personenkontosaldo "Personenkontosaldo"
	exec "Viewer.exe" "EXTERNAL#TemplateName=Reports/K/PersonenkontenInformation/Personenkontosaldo.xml\; Provider=Oracle Provider for OLE DB\; Server=$(ic_server)\; Database=$(ic_db)$(fk_mandant)\; Userid=$(ic_id)$(fk_mandant); Language=1033\;";

ACTION ao_stammdatenreport "AO Stammdatenreport"
	exec "Viewer.exe" "EXTERNAL#TemplateName=Reports/K/AO/Stammdatenreport.xml\; Provider=Oracle Provider for OLE DB\; Server=$(ic_server)\; Database=$(ic_db)$(fk_mandant)\; Userid=$(ic_id)$(fk_mandant); Language=1033\;";

ACTION notepad "Notepad" exec "notepad.exe" "EXTERNAL#$(fk_mandant)";

ACTION uebneu "Uebung vom Neuhäusel: $(fk_mandant)"
	exec "Viewer.exe" "EXTERNAL#TemplateName=Reports/K/PersonenkontenInformation/Personenkontoliste pro Jahr.xml\; Provider=Oracle Provider for OLE DB\; Server=$(ic_server)\; Database=$(ic_db)$(fk_mandant)\; Userid=$(ic_id)$(fk_mandant); Language=1033\;";


Nun möchte ich die menu-Blöcke matchen, inklusiver deren Inhalt.
Mein Pattern dazu sieht wie folgt aus:
Code:
Pattern p = Pattern.compile("menu\\s+\\w+\\s+[\\{](.*)[\\}]");

Doch so bekomme ich leider nichts raus.
Wenn ich ihn aber ändere zu :
Code:
Pattern p = Pattern.compile("menu\\s+\\w+\\s+[\\{](.*)");

liefert er mir immer den Anfang der menu-Blöcke und geht nicht bis zur schließenden } Klammer.
Also:
Code:
menu ic_menu
{
menu	Azubi_reports
{
menu	megaeat
{
menu	mehr_reports
{

kommt heraus.

Ach so, die Ausgabe erzeuge ich per
Code:
              Matcher m = p.matcher(mytext);
			
			while ( m.find() ) {
				System.out.println (m.group());
			}

Was mache ich falsch?
 
S

SlaterB

Gast
bei mir wird die komplette Datei in einem find() gefunden und ausgegeben,
was soll denn die Bedingung sein? warum glaubst du, dass das (.*) genau bis zum nächsten menue laufen wird?

nix da, du musst das Ende schon genau angeben, am einfachsten mit XML:
<menue>
...
</menue>

-----------

hier noch ein Pattern, über das du rätseln kannst:
Pattern p = Pattern.compile("menu\\s+\\w+\\s+[{]([^{]*[{][^{}]*[}][^}]*)*[}]");

Tipp: \\{ in eckigen Klammern [] kann auch direkt als { geschrieben werden,
geht bei den meisten Sonderzeichen,

wenn kein * oder ähnliches hinten dran kommt, dann kannst du dir []auch sparen, bei mir also z.B.

Pattern p = Pattern.compile("menu\\s+\\w+\\s+\\{([^{]*\\{[^{}]*\\}[^}]*)*\\}");
 

kama

Top Contributor
Hallo,

zuerst einmal hier ein kleiner Test-Case zum Probieren.
Ich würde Dir raten das Ganze zuerst einmal kleiner anzufangen.
Code:
public class PatternTest extends TestCase {

	public static final String search = "menu Anton { Hallo; }\nmenu Egon{ Hallo; }\nmenu Hugo { Hallo; }"; 

	public void testMatch () {
		Pattern p = Pattern.compile("menu\\s+(\\w+)\\s*\\{(.*)\\}"); 
		Matcher m = p.matcher(search);
		while ( m.find() ) {
			for(int i=0; i<=m.groupCount(); i++) {
				System.out.println("[" + i + "]=" + m.group(i));
			}
			System.out.println("--------------");
		}
	}
}

und zum anderen würde ich mir hier schon ernsthaft überlegen, schon ein Werkzeug wie ANTLR einzusetzten anstatt mit RegEx zu arbeiten.

Aber auf jeden fall immer in kleinen Schritten anfangen und TDD ....


MfG
Karl Heinz Marbaise
 

Leroy42

Top Contributor
Interessant:
Code:
menu   megaeat 
{ 
   titel:   "Essensverwaltung MegaPlus" 
   label:   "Essensverwaltung MegaPlus" 

   items 
   { 
      call megaeat_mitarb, 
      call megaeat_bestell, 
      call megaeat_print 
   } 
   buttons 
   { 
      fct1   $(hauptmenue)   mainmen, 
      fct2   $(verlassen)   leave 
   } 
}

Was soll das denn überhaupt für eine Sprache sein? :shock:
 
J

JavaRegexer

Gast
Hallo,

vielen Dank für eure Antworten.
@SlaterB

Danke dein Ausdruck funktioniert fast perfekt, er vergisst nur die allerletzte beim letzten Menu schließende } Klammer, aber ich denke das bekomme ich noch hin.
Ich versuch mal zu erklären, wie ich deinen Ausdruck verstanden habe, vielleicht finde ich dann ja raus was noch ergänzt werden muss.
Also
Code:
menu\\s+\\w+\\s+[{]
ist klar menu bis erste öffnende { Klammer.

Code:
[^{]*
Beliebig viele Zeilen ohne { am Anfang,

Code:
[{]
gefolgt von einer öffnenden { Klammer

Code:
[^{}]*
gefolgt von beliebig vielen Zeilen ohne jegliche Klammer am Anfang

Code:
[}]
eine schließende } Klammer

Code:
[^}]*
gefolgt von beliebig vielen Zeilen ohne schließende Klammer am Anfang.
Dies wären die einzelnen Blöcke wie Buttons, items etc.

Da das Ganz in ()* geklammert war, kann dieses Muster beliebig oft auftreten.

Code:
[}]

Die ansich abschließende } Klammer zum Menu, die Leider nicht funzt.

Ich habs auch schon ohne
Code:
[^}]*
versucht, leider ohne erfolg.
 
S

SlaterB

Gast
tja, bei mir gehts, aber ist müßig darüber zu reden,
ohne zu wissen, wie dein String tatsächlich vorliegt,
als Datei/ String, wie Eingelsen, Zeilenumbrüche oder nicht, ..

zwei Tipps:
1. siehe kama, klein anfangen,
2. vollständiges Programm posten,
auch wenn es mühselig ist, die 100 Zeilen direkt als Java-String zusammenzubauen,
ohne vollständiges Programm kann man keine Ergebnisse vergleichen,
wenn du Tipp 1. verfolgst, dann wird das auch leichter, da weniger zu tippen
 
J

JavaRegexer

Gast
Ah ok, das könnte es sein.
Ich lese den Inhalt aus einer Datei unter Linux ein.
Das mache ich wie folgt:
Code:
StringBuffer store = new StringBuffer();
	
	
	Pattern menublock = Pattern.compile("menu\\s+\\w+\\s+[{]([^{]*[{][^{}]*[}]*)*[}]", Pattern.UNIX_LINES | Pattern.MULTILINE );
		
	
	public MenueParser() {
		// TODO Auto-generated constructor stub
		
		try {
			Menuedatei = new File("ic.men"); 
			fr = new FileReader(Menuedatei);
			br = new BufferedReader(fr);
			
			zeile = br.readLine();
			while(zeile != null){
	             store.append(zeile+"\r\n");
	             zeile = br.readLine();
	        }
	        br.close();
	
			Matcher m = menublock.matcher(store.toString());
			
			while ( m.find() ) {
				System.out.println (m.group());
			}
			
		} 
		catch (FileNotFoundException fnfe) { 
		      System.out.println("Habe gefangen: "+fnfe); 
	    } 
	    catch (IOException ioe) { 
	      System.out.println("Habe gefangen: "+ioe); 
	    }

Vielleicht ein Problem mit den Zeilenumbrüchen?
 
S

SlaterB

Gast
da ich keine Linux habe, werde ich mich dazu nicht weiter äußern ;)
 
J

JavaRegexer

Gast
Hmm schade.
Darf ich die fragen wie du es erfolgreich testen konntest?
Also wie hast du die Datei nachgestellt?
 
S

SlaterB

Gast
Code:
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        File f = new File("temp.txt");
        BufferedReader r = new BufferedReader(new FileReader(f));
        StringBuilder b = new StringBuilder();
        String line = null;
        while ((line = r.readLine()) != null)
        {
            b.append(line);
        }
        Pattern p = Pattern.compile("(menu\\s+\\w+\\s+[{]([^{]*\\{[^{}]*\\}[^}]*)*[}])");
        Matcher m = p.matcher(b.toString());

        while (m.find())
        {
            System.out.println("f: " + m.group());
        }


    }
}
 
J

JavaRegexer

Gast
Ok ich versuchs mal damit.
Wie hast du denn die temp.txt erstellt?
Per Copy&Paste hier aus dem Forum?
 
J

JavaRegexer

Gast
Ok, ich glaube ich habe für heute genug :lol:

Ich musste deinen Code an 1 Stelle ändern um überhaupt eine Ausgabe zu bekommen
Code:
while ((line = r.readLine()) != null)
	        {
	            b.append(line[b]+"\n"[/b]);
	        }
	                
	        
//Hier wieder das [^}] raus, damit ich die schließenden KLammer bekomme
Pattern p = Pattern.compile("(menu\\s+\\w+\\s+[{]([^{]*\\{[^{}]*[}]*)*[}])" );

Soweit, so schlecht. Die letzte schließende KLammer kommt einfach nicht... :x

Aber ich danke dir für deine Mühen
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Compilerfehler bis in java.util.regex.Pattern... Allgemeine Java-Themen 2
B RegEx: (Um-)formulieren eines Pattern zur Identifizierung komplexer URLs Allgemeine Java-Themen 7
J Suche regex-Pattern fuer Liste von Zahlen zwischen 0-100 Allgemeine Java-Themen 6
S regex-Pattern Ausdruck negieren Allgemeine Java-Themen 2
S Pattern regex Allgemeine Java-Themen 2
J Pattern und Regex Allgemeine Java-Themen 2
M Pattern: Summary of regex constructs: Backslash Allgemeine Java-Themen 2
H Frage regex greater than less than Allgemeine Java-Themen 7
N Regex schlägt nicht an Allgemeine Java-Themen 10
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
T regex case insensitive trimmed Allgemeine Java-Themen 6
S Zeichen | in regex Allgemeine Java-Themen 8
X Regex mit mehreren Bedingungen machen Allgemeine Java-Themen 5
N Hilfe bei RegEx benötigt Allgemeine Java-Themen 3
C Java17 und Regex Allgemeine Java-Themen 13
OnDemand RegEx /compilebekomme nicht die erwarteten Werte Allgemeine Java-Themen 9
N Gierigen Regex in nicht-gierigen umwandeln Allgemeine Java-Themen 4
N E-Mail Validator (ohne Regex!) Allgemeine Java-Themen 7
OnDemand Regex von bis Allgemeine Java-Themen 6
W Versionsnummer auslesen - Regex ist zickig Allgemeine Java-Themen 2
L RegEx für Teile einer Berechnung Allgemeine Java-Themen 14
G Regex Allgemeine Java-Themen 2
L regex ganzer string? Allgemeine Java-Themen 2
MiMa Geldbetrag mit regex ermitteln. Allgemeine Java-Themen 14
W RegEx Stringliteral finden - Jflex Allgemeine Java-Themen 5
D Regex Probleme Allgemeine Java-Themen 2
Kirby.exe Regex charakter ignorieren Allgemeine Java-Themen 12
S Java SAT (Haltbarkeitsproblem) mit Regex Allgemeine Java-Themen 6
S [Regex] Nur diese Zeichen beachten Allgemeine Java-Themen 1
M Bitte Hilfe mit REGEX (Negieren) Allgemeine Java-Themen 4
C PDFBox: Nach RegEx ganze Zeile Allgemeine Java-Themen 4
S Regex mit UND-Verknüpfung Allgemeine Java-Themen 1
P RegEx für Zeiten Allgemeine Java-Themen 7
D Regex: Komplettes Wort bekommen Allgemeine Java-Themen 3
Neumi5694 Operatoren regEx für das Erstellen eines Strings verwenden Allgemeine Java-Themen 3
P RegEx Allgemeine Java-Themen 3
W String Parsen und auf eigenes Muster anwenden (kein Regex) Allgemeine Java-Themen 11
Y regex | n-faches Vorkommen oder gar keins Allgemeine Java-Themen 6
turmaline Regex gegen Regex prüfen Allgemeine Java-Themen 4
HarleyDavidson Regex - Optimierung Allgemeine Java-Themen 4
M Regex für Zahleneingabe in JavaFX Textfield Allgemeine Java-Themen 18
T Best Practice Wortregeln RegEx Allgemeine Java-Themen 11
A ALTER TABLE mit Hilfe von RegEx zerlegen, splitten Allgemeine Java-Themen 5
H Interpreter-Fehler Regex kompiliert nicht Allgemeine Java-Themen 5
M RegEx alle Matches ausgeben Allgemeine Java-Themen 5
Iron Monkey Mit Regex nach Beträge suchen Allgemeine Java-Themen 4
T REGEX Erklaerung Allgemeine Java-Themen 14
T Nur innerhalb des regex-Match ersetzen Allgemeine Java-Themen 9
H Pic Download / Regex Problem Allgemeine Java-Themen 7
F Frage zu Regex möglich Allgemeine Java-Themen 4
M Regex... mal wieder Allgemeine Java-Themen 3
H RegEx - Ersetze alles bis Leerzeichen Allgemeine Java-Themen 5
S regex verbrät CPU Allgemeine Java-Themen 6
V Regex Bereichs Filter Allgemeine Java-Themen 4
127.0.0.1 RegEx _ und 0-9 Allgemeine Java-Themen 45
S Entfernen von allen Nicht-Buchstaben chars aus einem String ohne Regex..? Allgemeine Java-Themen 10
P Java String Regex Allgemeine Java-Themen 2
AyKay Regex XPath Allgemeine Java-Themen 4
C Regex (Case insensitive und Umlaute) Allgemeine Java-Themen 4
D Regex Raute erkennen Allgemeine Java-Themen 2
nrg Zweistelligen Zahlenbereich mit RegEx Allgemeine Java-Themen 8
GilbertGrape Regex-Problem Allgemeine Java-Themen 2
W Denkblockade RegEx Allgemeine Java-Themen 2
S eigene regEx schreiben Allgemeine Java-Themen 4
C Regex expandieren Allgemeine Java-Themen 6
C Regex Überschniedung von Ausdrücken Allgemeine Java-Themen 16
reibi RegEX - Teilstring Allgemeine Java-Themen 6
R Java-RegEx terminiert nicht Allgemeine Java-Themen 3
M Regex: Ich stehe auf dem Schlauch Allgemeine Java-Themen 2
V Kleines Regex-Problem Allgemeine Java-Themen 3
B Regex "Problem" Allgemeine Java-Themen 4
P RegEx mit HTML Parser für Java möglich? Allgemeine Java-Themen 10
J Regex: Fertige URLS aus Javascript Allgemeine Java-Themen 3
N Java regex Allgemeine Java-Themen 5
K Regex JSON Allgemeine Java-Themen 3
J RegEx Ausdruck Allgemeine Java-Themen 2
J Regex: URLS aus CSS Allgemeine Java-Themen 2
G RegEx- Ausdruck Allgemeine Java-Themen 4
G RegEx kein Unterstrich Allgemeine Java-Themen 2
A Text via RegEx durchsuchen und teile ersetzten Allgemeine Java-Themen 5
C Regex: Zahl ohne führende Null Allgemeine Java-Themen 13
W RegEx Zeile parsen Medium Allgemeine Java-Themen 8
X Java String Regex - Sonderzeichen Filtern Allgemeine Java-Themen 5
S Dateiname mit Regex parsen Allgemeine Java-Themen 3
Loyd Noch ne Regex-Frage: Verschachtelte Ausdrücke Allgemeine Java-Themen 4
R Java Regex Frage Allgemeine Java-Themen 17
Daniel_L RegEx-Frage: Ersetzen in UBB ausschließen Allgemeine Java-Themen 2
M Große Datei mit Regex durchsuchen Allgemeine Java-Themen 4
S regex für einen Link Allgemeine Java-Themen 3
E Regex alles nach ? löschen Allgemeine Java-Themen 4
M RegEx-Frage Allgemeine Java-Themen 2
R Regex Tokenizer Allgemeine Java-Themen 11
E Regex HTML Tag und Inhalt löschen Allgemeine Java-Themen 4
H RegEX und eMail Allgemeine Java-Themen 4
L-ectron-X Regex zum Entfernen von mehrzeiligen Kommentaren Allgemeine Java-Themen 2
martin82 Regex - JTable - Filter Allgemeine Java-Themen 10
nrg Kleine Hilfe mit RegEx Allgemeine Java-Themen 2
B Regex-Fehler nach lib-Update Allgemeine Java-Themen 2
K Contrains oder Regex Allgemeine Java-Themen 3
J replaceAll , "[", "]" & regex Allgemeine Java-Themen 12

Ähnliche Java Themen

Neue Themen


Oben