# regex und indexof



## melmager (3. März 2004)

Erstmal zur Problembeschreibung:

Leider mag indexof keinen Regex (jedenfalls nach der Sun Beschreibung)

Ich müsste die Postion im String ermitteln wenn das Zeichen dort nicht mehr ein 
Buchstabe oder Zahl ist - sprich gib mir die Postion von einem Komma im String
(als beispiel)
ich bin beim Suchen auf findSubStringMatch gestolpert nur aus der Beschreibung werde ich nicht
ganz schlau ob die Function mir weiterhilft
hat da einer ein Stück Beispielcode ?

indexof("![A-Z0-9]") währe so schön gewesen 

Andere Hinweise werden auch gerne genommen.


----------



## Thomas Darimont (4. März 2004)

Moin!

Dann eben mal naiv...


```
/*
 * Created on 04.03.2004
 *
 * To change the template for this generated file go to
 * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
 */

/**
 * @author Darimont
 *
 * To change the template for this generated type comment go to
 * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
 */
public class RegTest {

	public static void main(String[] args) {
		String abc = "abcdefgh,ijklomn:pqrstuvw";
		int slen = abc.length();
		for (int i =0; i < slen;i++){
			char c = abc.charAt(i);
			if(!(c >= 'A' && c<= 'Z') && !(c>='a' && c<='z') && !(c>='0' && c<='9'))
				System.out.println("Zeichen " + c + " an Position: " + i); 
		}
	}
}
```

Gruß Tom


----------



## melmager (4. März 2004)

erstmal danke ..

Mal was ganz anderes: wie weit verschachtelt ihr Javafunctionen ?

wert = quelle.substring(atmppos,quelle.indexOf(czeile.charAt(cpos),atmppos));

ist eine eben gemachte Zeile von mir


----------



## Peter Bönnen (4. März 2004)

Hier mal eine Lösung mit regulärem Ausdruck:

```
String test = "test!test";
int index = test.split("[^a-zA-Z0-9]")[0].length();
```
Das würde deinem indexOf Beispiel entsprechen, da das erste String Element des Arrays aus der split Funktion in seiner Länge dem Index des gesuchten Zeichens im Gesamtstring entspricht.

Was das Verschachteln angeht: Wenn ich einmal dabei bin ein kompliziertes Konstrukt zu bauen, brech ich nicht mittendrin ab, weil ich denke, dass ich das auseinander friemeln müsste. Wenn's allerdings auch für andere lesbarer Quellcode sein soll, setz ich mich nach einer Zeit noch mal hin und tu was an der Übersichtlichkeit. Privat spar ich mir das aber meistens.

Kommt aber auch darauf an, wie gut sich so eine Verschachtelung beim einfachen durchlesen verstehen lässt. Oft genug machen auch Verschachtelungen mehr Sinn, als zig lokale Variablen. Oben hätte ich ja auch noch einen extra String für den regulären Ausdruck, ein String Array und noch mal einen String für das erste Array-Element anlegen können .

Peter


----------



## melmager (5. März 2004)

Hey die Idee mit split ist gut 

nur über was ich jetzt gestolpert bin:

blabla.split("[^\w]"); 

mault mein Jbuilder an mit dem Spruch "falsches Escape Zeichen"
spinnt der oder ist die Regex von Split eingeschränkt?

blabla.split("[^a-zA-Z0-9_]")

geht übrigends


----------



## Peter Bönnen (5. März 2004)

Jau, wenn du Unterstriche auch nicht gelten lassen willst, geht's natürlich auch mit [^\w] oder direkt \W. Kommt auf's gleiche raus.

Da der Java Compiler allerdings selber beim Kompilieren nach Escape-Zeichen in Strings sucht, musst du Escape Zeichen für reguläre Ausdrücke, die der Java Compiler nicht selber schon in das passende Zeichen übersetzen kann, mit Doppel-Backslash angeben:

blabla.split("\\W");

Peter


----------



## melmager (6. März 2004)

da habe ich micht etwas ungeschickt ausgedrückt -
Nicht der Compiler mault sondern schon der Editor.
Jbuilder macht schon bei der Eingabe ein Syntaxcheck 
hilft bei der Eingabe ungemein aber ich denke das ist ein Bug vom Editor
das er das \w anmault .. 
ich glaube ich werde das mal bei Borland loswerden.


----------



## Peter Bönnen (6. März 2004)

Dass ein \w angemeckert wird ist ja auch korrekt, das macht z.B. auch Eclipse und ich denke jeder Editor, der die Syntax testet. Es muss ja auch \\w sein, um es kompilieren zu können. Warum also nicht ein ungültiges \w im String schon bei der Eingabe anmeckern? 

Peter


----------



## melmager (8. März 2004)

hmmm

blabla.split("\n"); geht und funktioniert

blabla.split("\\w") auch kein mecker aber 
blabla.split("\w") mault er an 

da ist doch keinerlei Logic hintendran 
entweder alles mit doppelslash oder alles mit einem aber doch nicht Mischbetrieb :-(


----------



## Thomas Darimont (8. März 2004)

Hallo!

Eigentlich ist da doch sehr wohl Logik hinter ...

\ leitet eine Escape Sequenz ein ...
\\ Escaped die Escape Sequenz ...;-) damit kannst du dann z.Bsp. schreiben
System.out.println("Hallo \\n");
gibt aus -> Hallo \n;
System.out.println("Hallo \n");
Hallo
<-LEERZEILE->
...

Gruß Tom


----------



## melmager (8. März 2004)

Zusammenfassung:

bla.split("\n"), geht weil Java das cr Zeichen in den String reinbaut

bla.split("\\n") geht auch weil Java das \n an regex weiterreicht der daraus ein cr macht

Wird lustig wenn man im Regex ein \\ braucht dann muss man ja \\\\ machen 

----
So und jetzt muss ich nur noch den Fehler in meiner Recursion finden


----------



## Basti54 (13. Januar 2005)

Denn dazu mal jetzt ne Frage (ohne ein neues Thema eröffnen zu müssen  ):

 meine Methode zur email-Verifizierung:
 Pattern.matches("^([a-zA-Z0-9-]+)(\.[a-zA-Z0-9-]+)*@([a-zA-Z0-9-]+\.)+([a-zA-Z]{2,3})$",address)

 und dass ist meine Fehlerausgabe:
 "Ungültige Escapezeichenfolge (gültig sind nur  \b  \t  \n  \f  \r  \"  \'  \\ )" von Eclipse

 JEDER regulärer-Ausdruck-Tester findet was und meckert nich, nur der JavaCompiler hat was gegen die Backslashes in einem String. Was mach ich denn da?


----------



## Peter Bönnen (13. Januar 2005)

Hallo!
Für jeden RegEx-Backslash in einem Java-String musst du einen doppelten Backslash eingeben. Dies ist notwendig, da der Java-Compiler selber bereits Escape Sequenzen interpretiert, die mit einem Backslash beginnen.

Das müsste dann bei dir also so aussehen:
	
	
	



```
Pattern.matches("^([a-zA-Z0-9-]+)(\\.[a-zA-Z0-9-]+)*@([a-zA-Z0-9-]+\\.)+([a-zA-Z]{2,3})$",address)
```
Gruß Peter


----------

