# RegEx Version number



## Generic1 (24. Mai 2012)

Hi,

ich habe folgende Strings die so aufgebaut sind: 


```
irgend-ein-name-der-verschieden-lang-sein-kann-0.0.0.0.zip
```

ich möchte jetzt die Version, die immer 4 Stellig ist irgendwie rausbekommen mit regex und ohne die Endungen (.zip) -> also das Ergebnis soll sein: 

0.0.0.0

Weiß jemand wie ich das mit RegEx machen kann (bin darin leider gar nicht gut)

Besten Dank,
lg


----------



## nillehammer (24. Mai 2012)

```
public class VersionGrabber {
/**
   * Pattern, dass Filenames matcht, wenn sie:
   * - mit beliebigen Zeichen anfangen: .*
   * - danach einen vierstelligen Versionsstring enthalten (\\d+\\.\\d+\\.\\d+\\.\\d+),
   *     \\d=Ziffer, \\.=Punkt
   * - mit .zip aufhören
   * Der Versionsstring wird über eine sog. Capturing Group (deswegen die Klammern) gecaptured.
   */
private static final Pattern VERSION_PATTERN = Pattern.compile(".*(\\d+\\.\\d+\\.\\d+\\.\\d+)\\.zip");

/**
   * Pult den Versionsstring aus einem Filenamen
   * @param fileName der Name des Files, für das die Version ausgegeben werden soll
   * @return den Versionsstring
   * @throws IllegalStateException, wenn der fileName eine ungültige Struktur hat
   */
public String grabVersionString(final String fileName) {

  final Matcher versionMatcher = VERSION_PATTERN.matcher(fileName);

  return versionMatcher.group(1);
}
```


----------



## SlaterB (24. Mai 2012)

so eingeschränkt wie das ist, kann man auch gleich vom Ende des Strings aus 4 und 11 Zeichen oder so abzählen und substring() ausführen


----------



## nillehammer (24. Mai 2012)

SlaterB hat gesagt.:
			
		

> so eingeschränkt wie das ist, kann man auch gleich vom Ende des Strings aus 4 und 11 Zeichen oder so abzählen und substring() ausführen


Stimmt, habe das Pattern aus meinem ersten Post darum angepasst, damit es auch mehrstellige Ziffern matcht. Aber auch da kann man mit Abzählen und evtl. indexOf("-") Substrings bilden.


----------



## Generic1 (24. Mai 2012)

nillehammer hat gesagt.:


> ```
> public class VersionGrabber {
> /**
> * Pattern, dass Filenames matcht, wenn sie:
> ...



Besten Dank erstmal, die Methode funktioniert noch nicht ganz, ich bekomme ein No match found. 
Hättest du vielleicht noch einen Tip was ich da falsch mache?


----------



## SlaterB (24. Mai 2012)

erstaunlich wie wenig du auch mit fast 1000 Postings selber zustandebringst

RegEx fragst du nicht gerade selten, oder?
mindestens schon seit Januar 2010
http://www.java-forum.org/allgemeine-java-themen/95294-regex.html
da vielleicht nicht direkt in Java, aber ist es so schwer, die passenden 5 Zeilen dazu zumindest immer wiederzufinden?

nillehammer hat (in der Eile sicherlich) den matches()-Aufruf vergessen,
dessen evtl. Rückgabewert false könnte man sicher noch nutzen, bevor man dann in eine evtl. Exception bei group(1) läuft


```
public class Test {
    private static final Pattern VERSION_PATTERN = Pattern.compile(".*(\\d+\\.\\d+\\.\\d+\\.\\d+)\\.zip");

    public static String grabVersionString(final String fileName)  {
        final Matcher versionMatcher = VERSION_PATTERN.matcher(fileName);
        versionMatcher.matches();
        return versionMatcher.group(1);
    }

    public static void main(String[] args)   {
        String st = "irgend-ein-name-der-verschieden-lang-sein-kann-0.0.0.0.zip";
        System.out.println(grabVersionString(st));
    }
}
```


----------



## nillehammer (24. Mai 2012)

Generic1 hat gesagt.:
			
		

> Besten Dank erstmal, die Methode funktioniert noch nicht ganz, ich bekomme ein No match found.
> Hättest du vielleicht noch einen Tip was ich da falsch mache?


Vielleicht passt die Regex nicht so ganz. Spiel etwas mit ihr herum. Viel sollte ja nicht fehlen.


			
				SlaterB hat gesagt.:
			
		

> nillehammer hat (in der Eile sicherlich) den matches()-Aufruf vergessen,
> dessen evtl. Rückgabewert false könnte man sicher noch nutzen, bevor man dann in eine evtl. Exception bei group(1) läuft


Die Vermutung liegt nahe, weil das öfter passiert . In diesem Fall war es aber Absicht. Ich habe darüber nachgedacht, was passieren soll, wenn der Filename eine ungültige Struktur hat. _Null_ returnen hat mir nicht gefallen, deswegen fand ich Exception schmeißen am besten. Aber bevor ich jetzt mit 
	
	
	
	





```
if(versionMatcher.matches(...)
```
 prüfe und dann bspw. eine IllegalArgumentException schmeiße, dachte ich kann ich auch gleich die Exception des Matchers fliegen lassen.


----------



## SlaterB (24. Mai 2012)

weil es noch nicht eindeutig nach Erkenntnis klingt:
den Fehlerfall kannst du ja ignorieren, wie in meiner schnellen Korrektur,
aber ohne matches() kannst du kein group(1) aufrufen 

das wegzulassen ist also keine Option


----------



## nillehammer (24. Mai 2012)

SlaterB hat gesagt.:
			
		

> [...]das wegzulassen ist also keine Option


Tatsache! Obwohl ich Testcode dafür geschrieben habe, ist mir das garnicht aufgefallen . Also, vor dem hier: 
	
	
	
	





```
versionMatcher.group(1)
```
 *muss* das kommen: 
	
	
	
	





```
versionMatcher.matches()
```


----------

