# Regex funktioniert nicht



## deamon (17. Mrz 2009)

Hallo,

ich verstehe einfach nicht, warum folgender regulärer Ausdruck nicht funktioniert.

```
public class Regex {
        // Zeilenanfang, beliebige Leerzeichen, ein Gleichzeichen, beliebige Whitespaces, 
        // beliebige Zeichen außer Gleichzeichen, beliebige Zeichen.
	private static final Pattern H1 = Pattern.compile("^ *=\\s*([^=]*).*");
	public static void main(String[] args)
	{
		String line = "  ====== Heading of level 6 ======";
		Matcher matcher = H1.matcher(line);
		if(matcher.matches())
			System.out.println("H1:" + matcher.group(1));
	}
}
```
Ausgabe ist: H1:
Aber eigentlich dürfte der Regex hier überhaupt nicht passen. Kann mir mal jemand auf die Sprünge helfen?


----------



## mvitz (17. Mrz 2009)

Evtl so?
[HIGHLIGHT="Java"]private static final Pattern H1 = Pattern.compile("^ *=*\\s*([^=]*).*");[/HIGHLIGHT]

Du hast mehrere = und zu \s gehört = imho nicht dazu

Edit: Argh oder ist deine Regex so richtig und du wunderst dich nur, dass Matcher.matches passt?

Edit2:
Der passt halt.
Du hast Zeilenanfang, 2x Leerzeichen, 1x Gleichheitszeichen, 0x Whitespace, 0x Zeichen außer Gleichheitszeichen, und dann beliebige Zeichen.

Du müsstest dann vermutlich nicht mit dem * arbeiten, sondern mit {}


----------



## deamon (17. Mrz 2009)

Genau, der matcher dürfte nicht passen, weil der nur ein = akzeptieren dürfte, es aber sechs davon gibt.


----------



## mvitz (17. Mrz 2009)

Siehe meine Edit2 von oben.


----------



## deamon (17. Mrz 2009)

Das verstehe ich nicht. Im Regex steht nur ein = aber in dem zu prüfenden String stehen 6 =. Wie kann

```
"  ====== Heading of level 6 ======"
```
auf

```
"^ *=\\s*([^=]*).*"
```
passen?


----------



## mvitz (17. Mrz 2009)

Es kommt ja nach deinen Leerzeichen ein = Und danach kommen halt 0x Whitespace 0x Zeichen außer =. Damit bist du praktisch noch immer nach dem ersten =. Und dann kommen halt beliebige Zeichen. Ich weiß auch nicht, wie ich dir das jetzt anders erklären kann. Muss denn nach dem ersten = mindestens ein Whitespace kommen? Wenn ja, dann könntest du das folgendermaßen machen:
[HIGHLIGHT="Java"]private static final Pattern H1 = Pattern.compile("^ *=\\s{1,}([^=]*).*");[/HIGHLIGHT]

D.h. Zeilenanfang, beliebige Leerzeichen, 1x Gleichzeichen, 1-beliebige Whitespaces, beliebige Zeichen außer Gleichzeichen, beliebige Zeichen


----------



## Spacerat (17. Mrz 2009)

Bin grad' aus der Übung mit RegExp... Bedeutet "*=" nicht beliebig viele "="?


----------



## mvitz (17. Mrz 2009)

Das wäre =*

man gibt zuerst das Zeichen/die Zeichengruppe an und anschließend die gewünschte Anzahl (außer ich bin gerade voll daneben)

Achso meine neue Variante ist einfacher, wenn man es so schreibt:
[HIGHLIGHT="Java"]private static final Pattern H1 = Pattern.compile("^ *=\\s+([^=]*).*");[/HIGHLIGHT]


----------



## deamon (17. Mrz 2009)

Nein, der Quantifizierer steht immer hinter dem Zeichen oder der Gruppe. =* würde also beliebig viele =-Zeichen bedeuten.


----------



## deamon (17. Mrz 2009)

Danke für die Erklärung! Ich habe es verstanden  Ich weiß nur nicht, wie ich meine Erkenntnis jetzt in einen Regex umwandeln soll. Ich behelfe mir damit, dass hinter den Gleichheitszeichen mindestens ein Nichtgleichheitszeichen kommen muss.


```
"^ *=\\s*([^=]+).*"
```


----------



## mvitz (17. Mrz 2009)

deamon hat gesagt.:


> Danke für die Erklärung! Ich habe es verstanden  Ich weiß nur nicht, wie ich meine Erkenntnis jetzt in einen Regex umwandeln soll. Ich behelfe mir damit, dass hinter den Gleichheitszeichen mindestens ein Nichtgleichheitszeichen kommen muss.
> 
> 
> ```
> ...



Jo, so geht es auch. Andere Möglichkeit wäre halt die von mir mit min. 1xWhitespace, aber wenn das bei dir nicht gegebn ist, würde ich das auch so machen


----------

