Spezieller Regex gesucht

Danke für den Tip.
Aber aus Gründen der konsistenz (im Code) und konfigurierbarkeit nützt mir das nichts.
Es geht bei dem Tool um Übersetzung von JSPs. Relevante JSP- und HTML-tags können in externen txt-files angegeben werden. Mit diesen Angaben werden dann die Regexe zusammengebastelt. Dieser HTMLEditor ist schon gut, aber da die relevanten HTML-Tags sich ändern können kann ich dass nicht hardcoden htmlDoc.getIterator(HTML.Tag.A)( (An dieser Stelle müsste halt was dynamisches stehen).
 
Vatar hat gesagt.:
Und weiter gehts.
Neben den speziellen Tags brauch ich teilweise auch noch den Inhalt von normalen HTML-Tags. Diese Tags werden in einer txt angegeben
Code:
<td class="dunkelBlauWeiss">Lieferantennummer / AdressIndex<br>(local supplier code)</td> // hier brauch ich den Inhalt

<td><vcc:textFieldComponent size="12" width="110" maxlength="30" name="NUMMER" /></td> // hier brauch ich ihn nicht
Code:
String regex = "<td.*>(.*)</td>" // wird im Programm je nach spezifizierten Tag zusammengebastelt
Leider bekomme ich hier nur local supplier code zurück.
Ich hab schon mit [^br] usw rumprobiert, aber dann stimmen andere Sachen nicht mehr.
Er soll also in der Gruppe einfach die <br>-Tags mitnehmen.

thx
Was meinst du mit br-Tags mitnehmen?, soll er das br rausloeschen?

//edit: Oder moechetst du Lieferantennummer / AdressIndex<br>(local supplier code)
diesen ganzen Text haben?
 
Zuletzt bearbeitet:
Genau: ich brauche den gesammten Content zwischen öffnenden und schließenden Tag.
Also Lieferantennummer / AdressIndex<br>(local supplier code) als Ergebnis.
 
Code:
<td.*?>(.*<br>.*?)</td>
bringt das gewuenschte Ergebnis bei mir.
mfg

edit: Aber auch nur wenn die Zeilen untereinander stehen, nicht wenn sie hintereinander sind...
 
Zuletzt bearbeitet:
Danke, aber leider taucht der <br>-Tag nicht immer auf.
Code:
   public static void main( String[] args ) {
        String test =   "<td class=\"blauDunkelBlau\">Lieferantennummer / AdressIndex<br>(local supplier code)</td>" + 
                        "<td class=\"blauDunkelBlau\">hallo</td>";

        String regex = "<td.*?>(.*<br>.*?)</td>";

        Matcher matcher = Pattern.compile( regex ).matcher( test );
        int i = 0;
        while( matcher.find() ) {
            System.out.println( ++i + "\t" + matcher.group( 1 ) );
        }
    }
In diesem Fall sollte er
1 Lieferantennummer / AdressIndex<br>(local supplier code)
2 hallo
ausgeben.


Habs nochmal verändert (soweit ich die Regex bisher verstanden habe) aber dann liefert er mir zu viel (1 Lieferantennummer / AdressIndex<br>(local supplier code)</td><td class="blauDunkelBlau">hallo)
(<td.*?>(.*[<br>]?.*?)</td>
 
Keine Angst. Ich brauche keine Hilfe für einen neuen Regex ;-). Aber ich brauche Hilfe bei der Nutzung der Engine.

Nachdem nun alle relevanten Texte aus meinem Content-String extrahiert wurden (Dank eurer Hilfe :) ), muss ich nun an diese Stelle ( group(1) ) andere Texte einfügen.

Dies endet in einer netten Endlosschleife und ersetzt auch sehr seltsam :confused:
Code:
public static void main( String[] args ) {
        String test =   "<td class=\"blauDunkelBlau\"><div>Lieferantennummer / AdressIndex<br/>(local supplier code)</div></td> \n" + 
                        "<td class=\"blauDunkelBlau\">hallo</td>\n" + 
                        "<td>Test</td>\n" + 
                        "<tr><td>&nbsp;</td><td valign='top'><table width='0' border='0' cellspacing='1' cellpadding='0'><tr><td><a href='<fwk:dialog_getFunctionAsUrl function=\"lb&RUN_IN_MAINTENANCE_APPLICATION=true\" />' target=\"frameLowContent\" onmouseover=\"status='LoadBalancer Monitoring';return true;\" onmouseout=\"status='Lima On Web Maintenance' ;return true;\"><img src='/low/img/core/strich.gif' width='7' height='7' border='0'></a></td><td class='menuBlattTd'>&nbsp;</td></tr></table></td><td colspan='1'><a href='<fwk:dialog_getFunctionAsUrl function=\"lb&RUN_IN_MAINTENANCE_APPLICATION=true\" />' target=\"frameLowContent\" class='menuBlatt' onmouseover=\"status='LoadBalancer Monitoring';return true;\" onmouseout=\"status='Lima On Web Maintenance';return true;\">LoadBalancer Monitoring</a></td></tr>";

        String regex = ">(\\w.*?[<br>]?.*?)</";

        Matcher matcher = Pattern.compile( regex ).matcher( test );
        while( matcher.find() ) {
           System.out.println(matcher.replaceAll("bla"));  
        }
    }
Code:
Matcher matcher = Pattern.compile( regex ).matcher( test );
        while( matcher.find() ) {
           matcher.group(1). -> keine Ahnung
        }
Man könnte jetzt natürlich annehmen dass ich, nachdem ich alle Texte habe, einfach so vorgehen könnte:
Code:
content = content.replaceAll(alterText, neuerText)
Das funktioniert aber nicht, da es auch kurze Texte (Kürzel) gibt welche auch in anderen Tags/Attributen vorkommen können.
Er muss also wie beim extrahieren nach den Tags suchen und dann den Substring der aktuellen Gruppe 1 austauschen.

Ich hoffe ihr könnt mir nochmal helfen.
Thx

[EDIT]
Code:
Matcher matcher = Pattern.compile( regex ).matcher( test );
        int lenth = test.length();
        while( matcher.find() ) {
           int start = matcher.start(1);
           int end = matcher.end(1);
           
           System.out.println("Start: " + start + "\t" + "Ende: " + end);
           if(start < end && end < lenth){
               String before = test.substring(0, start - 1);
               String after = test.substring(end, lenth);
               test = before + "REPLACEMENT" + after;
           }
        }
Hierbei bekomme ich eine ArrayIndexOutOfBoundsException bei test.substring(end, length) die ich überhaupt nicht nachvollziehen kann (auch nicht mit dem debugger).
Das lustige ist:
Wenn ich dies ausführe komme ich soweit
Start: 32 Ende: 89 Länge: 932
Start: 129 Ende: 134 Länge: 932

Und wenn ich after = test.substring(end) mache
Start: 32 Ende: 89 Länge: 932
Start: 129 Ende: 134 Länge: 932
Start: 144 Ende: 148 Länge: 932
Start: 895 Ende: 918 Länge: 932

Obwohl es ja eigentlich beide male genau das gleiche sein sollte.
:confused: :confused: :confused:

Desweiteren stellt dieser Lösungsansatz einen extremen Objektoverkill dar (grob gerechnet 50000-60000 String-Objekte).
 
Zuletzt bearbeitet:
hmm, also mein Vorschlag waere einen StringBuffer zu benutzen mit der methode
Code:
replace(int start, int end, String str);
die start und endwerte sind bei mir
Code:
matcher.start() + 1;
und
matcher.end() -2;
warum das so ist ist mir auch nicht ganz klar...
mfg
 

Neue Beiträge

Zurück