Spezieller Regex gesucht

Danke. Aber die ArrayIndexOutOfBoundsException ist immer noch. Ich hab rausgefunden, dass er intern den String kürzer führt als er ist.
Code:
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>";

System.out.println(test.length);
gibt mir eine Länge von 932 aus, aber intern führt er den String mit einer Länge von 896. :confused:
Ich habs auch schon mit kürzeren String versucht -> immer das gleiche.

[EDIT]Man bin ich doooooof.
Der matcher ist ja schon fertig, und hat demnach noch die alte Länge und wenn ich ein replace mache, ändert sich ja die Länge.
 
Zuletzt bearbeitet:
Hat sich erledigt. Funktioniert bestens.
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>";

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

        Matcher matcher = Pattern.compile( regex ).matcher( test );
        ArrayList startListe = new ArrayList();
        ArrayList endeListe = new ArrayList();
        while( matcher.find() ) {
            startListe.add( new Integer( matcher.start( 1 ) ) );
            endeListe.add( new Integer( matcher.end( 1 ) ) );
        }
        for(int i=startListe.size() - 1; i>=0; i--){
            sb.replace( ((Integer)startListe.get(i)).intValue(), ((Integer)endeListe.get(i)).intValue(), "REPLACEMENT");
            System.out.println(i);
        }
        System.out.println( sb.toString() );
    }

Einfach alle Start und Ende Indexe speichern und den String von hinten aufarbeiten.
 
So, ein allerletztes mal bräuchte ich noch eure Hilfe.

Da Tags ja bekanntlich geschachtelt werden können muss ich meinen Parser noch um eine Kleinigkeit erweitern. Es kann also vorkommen dass der Text den ich extrahiert habe wiederum Tags enthällt. Aus diesem Text möchte ich dann wiederum nur den reinen Inhalt haben und zwar mit einem möglichst variablen Regex (nur ein tag davor oder danach, davor und danach, ...)

Ich hatte mir das bisher so gedacht (keine JavaSyntax).
TestString:
Code:
<div>Zuordnung Prozessbeteiligte f&uuml;r <low:toolTip name="OP" bean="<%=LowWebappInfermWebSymbols.TIMEPERIOD_RESULT_VIEW%>"/> <low:toolTip name="TIME_PERIODE" bean="<%=LowWebappInfermWebSymbols.TIMEPERIOD_RESULT_VIEW%>"/>
Regex
Code:
(<\w.*?>)?(\w.*?)(</?\w.*?/?>)
Das funktioniert auch mit einem Variablem Tag zu Beginn (oder eben keiner zu Beginn) wunderbar. Ich lasse mir dann den Text von Gruppe2 geben.

Die Erweiterung
Code:
(<\w.*?>)?(\w.*?)(</?\w.*?/?>)?
liefert mir aber leider nicht mehr den gesammten Text der Gruppe2 mit dem ersten Match, sondern jedes Zeichen einzeln nach dem ersten tag bis zum Schluss.

Kurz und knapp: Das ergebnis muss Zuordnung Prozessbeteiligte f&uuml;r sein egal davor und/oder danach ein Tag steht.

thx
 
keine ahnung ob ich dich richtig verstanden habe aber schau mal ob es das ist was du suchst
Code:
(<\w.*?>)?(\w.*?)(</?\w.*?/?>).*?
 
Schon etwas besser.
<tag>text<tag> -> funktioniert
text<tag> -> funktioniert
<tag>text -> funktioniert nicht
text -> funktioniert nicht
Die beiden letzen versionen müssen sein. Ich kapier diese Regex-Engine nicht so ganz. Von der Logik her müsste eas doch funktionieren, vor allem da der anfangstag ja schon variabel funktioniert.
 
Poste mal bitte alle varianten die du getestet haben moechtest, ich kappier leider nicht was du gerne moechtest, also bitte alle 4 Varianten als String einmal posten...
mfg
 
Wieder mal Danke für deine Zeit.

Code:
<div>TEST</div>

Code:
<div>TEST

Code:
TEST<vcc:linkComponent value="bla"/>

Code:
TEST

Er soll immer TEST ausgeben.
 
Moin,
kann ich mit so einem Pattern einen String auch auf folgende Zeichen prüfen:

\ / : * ? " < > |

Wenn ja, wie sieht das ganze denn dann aus?

Danke
 
Code:
public class Tester {

	public static void main(String[] args) {
		String a = "aaaa ? kadlj | djasldj <> adaslkdj :ljasdka \\asldja / adlasdjh \"";
		String regex = ("\\?|\\||:|\\\\|/|<|>|\"");
		Matcher m = Pattern.compile(regex).matcher(a);
		while(m.find())
			System.out.println(m.group());
	}
}
Das gibt dir die gefundenen Zeichen aus.
\, |, ?,. sind Sonderzeichen der Regexengine und müssen escaped werden, da \ aber auch schon für Java ein Steuerzeichen ist musst du, um ein \ der Regexengine mitzuteilen \\ schreiben. Das ganze wird noch etwas verückter wenn du nach einem \ in deinem String suchst. Dann muss du insgesammt 4x \ schreiben: 2 Steuerzeichen in Java damit bei der Regexengine auch 2 \ ankommen, das erste ist wiederum ein Steuerzeichen für die Regexengine.

Ich hoffe das war nicht zu verwirrend :)
 
Zuletzt bearbeitet:
Zurück