# regex mit utf-8 string



## klaesmann (3. Mrz 2009)

Hallo zusammen!

Ich bin neu in der Java-Programmierung und habe folgendes Problem:
Einen UTF-8 String, möchte ich via regex durchsuchen. Mein regex habe ich mit einem "normalen" String ausgeführt und es funktioniert?
Was mache ich falsch bzw. wo liegt der Fehler?
Hier ist mein Code-Ausschnitt:

Variablen:

```
utf8String = new String ("<ps:Paragraph_Style_1>Deutscher\nMeister<ps:Paragraph_Style_1>\r".getBytes(),"UTF-8");

normalString = "<ps:Paragraph_Style_1>Deutscher\nMeister<ps:Paragraph_Style_1>\r";
```

Methoden:

```
public static Iterable <MatchResult> findMatches( String pattern, CharSequence s ) 
	{ 
	  ArrayList<MatchResult> results = new ArrayList<MatchResult>(); 
	 
	  for ( Matcher m = Pattern.compile(pattern).matcher(s); m.find(); ) 
	    results.add( m.toMatchResult() ); 
	 
	  return results; 
	}



	for (MatchResult r : findMatches ("<ps:([\\sa-zA-Z_0-9+-]+)>([\\s\\t\\n\\sa-zA-Z_0-9+-]*)</ps:([\\sa-zA-Z_0-9+-]+)>", utf8String))
	{
		System.out.println("1: " + r.group(1));
		System.out.println("2: " + r.group(2));
	}


        for (MatchResult r : findMatches ("<ps:([\\sa-zA-Z_0-9+-]+)>([\\s\\t\\n\\sa-zA-Z_0-9+-]*)</ps:([\\sa-zA-Z_0-9+-]+)>", normalString))
	{
		System.out.println("1: " + r.group(1));
		System.out.println("2: " + r.group(2));
	}
```

Vielen Dank schon mal im voraus.  

Gruß
Klaesmann


----------



## Ebenius (3. Mrz 2009)

Der erste Fehler liegt bereits im Verständnis. In Java sind alle Strings Unicode. UTF-8 ist ein Unicode Transfer Encoding, das hat im Quelltext an der Stelle nichts verloren, sondern ist dafür da, String zu en-/dekodieren die über I/O transferiert werden. Also statt: [HIGHLIGHT="Java"]utf8String = new String ("<psaragraph_Style_1>Deutscher\nMeister<psaragraph_Style_1>\r".getBytes(),"UTF-8");[/HIGHLIGHT]
... solltest Du schreiben: [HIGHLIGHT="Java"]unicodeString = "<psaragraph_Style_1>Deutscher\nMeister<psaragraph_Style_1>\r";[/HIGHLIGHT]

Dein zweites Problem liegt dann in der RegEx selbst. "A-Z" sind in Java alle Zeichen "ABCDEFGHIJKLMNOPQRSTUVWXYZ", Umlaute, etc. gehören da nicht dazu.

Details zu regulären Ausdrücken in Java findest Du in der API-Doc der Pattern-Klasse. Beliebige Unicode-Buchstaben (inkl. A-Za-zäüöß字符) findet man mit dieser Character-Class: 
	
	
	
	





```
\p{L}
```
Übertragen auf Dein Beispiel müsste das (ungetestet) so oder so ähnlich aussehen: 
	
	
	
	





```
<ps:([\\s\\p{L}_0-9+-]+)>([\\s\\t\\n\\s\\p{L}_0-9+-]*)</ps:([\\s\\p{L}_0-9+-]+)>
```
Carpe Noctem.

Ebenius


----------



## HoaX (3. Mrz 2009)

klaesmann hat gesagt.:


> ```
> utf8String = new String ("<ps:Paragraph_Style_1>Deutscher\nMeister<ps:Paragraph_Style_1>\r".getBytes(),"UTF-8");
> ```



Ganz böse. String#getBytes() liefert die Bytes im Defaultencoding zurück und danach kodierst du fest mit UTF-8 ... steck mal ein Umlaut in den Ausgangsstring. Wenn du unter Windows bist hast du iirc Latin1 als Defaultencoding und du erhälst einen kaputten String.


----------

