RegEx Version number

Generic1

Top Contributor
Hi,

ich habe folgende Strings die so aufgebaut sind:

Code:
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
 
N

nillehammer

Gast
Java:
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);
}
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
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
 
N

nillehammer

Gast
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

Top Contributor
Java:
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);
}

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?
 
S

SlaterB

Gast
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

Java:
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));
    }
}
 
N

nillehammer

Gast
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 :oops:. 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
Code:
if(versionMatcher.matches(...)
prüfe und dann bspw. eine IllegalArgumentException schmeiße, dachte ich kann ich auch gleich die Exception des Matchers fliegen lassen.
 
S

SlaterB

Gast
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
 
N

nillehammer

Gast
SlaterB hat gesagt.:
[...]das wegzulassen ist also keine Option
Tatsache! Obwohl ich Testcode dafür geschrieben habe, ist mir das garnicht aufgefallen :eek:. Also, vor dem hier:
Code:
versionMatcher.group(1)
muss das kommen:
Code:
versionMatcher.matches()
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Regex-Regel um fehlende Schlusszeichen zu finden Softwareentwicklung 1
H Regex Frage Softwareentwicklung 2
C Regex Problem Softwareentwicklung 1
H [Java]Regex Hilfe Softwareentwicklung 3
TheJavaKid RegEx Problem Softwareentwicklung 2
P Nur ganze Worte ersetzen mit RegEx Softwareentwicklung 2
C Regex-Problem Softwareentwicklung 24
M Regex Ausnahmen/Bedingungen Softwareentwicklung 5
H [RegEx] Anführungszeichen finden Softwareentwicklung 2
B Regex-Problem mit replace außerhalb des matching bereichs liegender Zeichenketten Softwareentwicklung 2
A Regex mit Negation Softwareentwicklung 2
ruutaiokwu regex, der mit nur html-comments, nicht aber javascript entfernt Softwareentwicklung 16
V RegEx um zu escapen? Softwareentwicklung 2
TiME-SPLiNTER Banales regEx-Problem Softwareentwicklung 2
B Regex, um Sätze zu erkennen Softwareentwicklung 3
A Verschachteln von REGEX Softwareentwicklung 4
D Regex zur auswertung von SQL Statements Softwareentwicklung 3
S Regex Frage Softwareentwicklung 4
S sonderzeichen mit regex abfragen Softwareentwicklung 2
N Wie testet ihr regex auf korrektheit? Softwareentwicklung 8
m@nu Problem mit einer RegEx Softwareentwicklung 4
S [RegEx] Dateigerecht geschriebene Namen parsen Softwareentwicklung 2

Ähnliche Java Themen


Oben