RegExp auf NICHT matchen
-
Hallo,
(am besten gleich zu DIE PROBLEMATIK springen)
ich bin gerade dabei mit ANT ein build zu schreiben, dass u.a. in einer C++ (.cpp) Datei ein '#define VERSION "1.2.3"' neu setzt, per RegExp.
Per ANT ist das Inkrementieren on-the-fly wohl nicht möglich, daher muss ich den Umweg gehen, die Versionsnummer zu extrahieren, als Property (~Variable) zu integrieren und neu zu schreiben.
Das Integrieren ist per Datei im Format "key = value" (INI-Style) möglich. Also dachte ich, formatiere ich die zu suchende Zeile so um und lösche den restlichen Quellcode raus.Die Zeile die ich treffen möchte:
#define VERSION "1.2.34"Mein Ziel:
#define VERSION "1.2.35"Ich matche die Zeile so:
#define VERSION "([0-9]+)\.([0-9]+)\.([0-9]+)"(ANT liest die builds per XML ein, daher ")
Wie finde ich alle Zeilen, die NICHT so aufgebaut sind und lösche sie?
Meine Idee war, anstatt nochmal nach nicht genau dieser Zeile zu suchen
Pseudocode! (der übrigens nicht funktioniert)
!(#define VERSION "([0-9]+)\.([0-9]+)\.([0-9]+)")setze ich vor meine Trefferzeile einen String, der einmalig im Quelltext ist, z.B. ANT_BUILD_UNIQUEFLAG und suche im 2. Durchgang jetzt nach jeder Zeile, die NICHT mit "ANT_BUILD_UNIQUEFLAG" anfängt und ersetze sie durch einen Leerstring.
Somit wäre mein Ergebnis
ANT_BUILD_UNIQUEFLAG#define VERSION "1.2.34"DIE PROBLEMATIK:
Ich finde einfach den regulären Ausdruck nicht, für ein Matching auf alle Zeilen, die nicht mitdem String "ANT_BUILD_UNIQUEFLAG" anfangen.
Meine Ideen
!(ANT_BUILD_UNIQUEFLAG).*
[(ANT_BUILD_UNIQUEFLAG)].*Ersteres geht mit
http://www.regular-expressions.info/javascriptexample.html
wunderbar, in Java aber eben nicht mehr.
Zweiteres ist tricky, funktioniert zwar, trifft aber auch NNNNTABU_ILD_UNIQUEFLAG.Der Regexp "[PETER]" trifft ja nicht nur den String "PETER" sondern eben auch "TEERP", das will ich ja aber verhindern.
Puh, hat jemand verstanden was ich meine. Rätsel da schon die ganze Zeit mit nem Kollegen rum.
Und wenn jemandem ne leichtere Lösung des Problems zu ANT einfällt, einfach sagen
Ein kleines Programm schreiben, dass ich per ANT anstosse will ich aber nicht.
-
naja gerade WENN du [ABC] schreibst, werden auch A, B, und C gesucht. du musst schon etwas präziser formulieren. Zum Beispiel findet PET[A-Z]+ "PETER" aber auch "PETFLASCHE" jedoch nicht "ETPA"
ich blick das Thema auch nicht wirklich es hilft aber sich die standardzeichen (z.B. Perl-kompatible) für reguläre Ausdrücke anzuschauen.
EDIT: schreibe niemals "geht sofort zu Problematik" ^^ also vergiss meinen Absatz oben...
^ funktioniert nur zwischen [ und ]
vielleicht klappt es mit ~ (Tilde)
-
äh moment nochmal. du willst also mit ant, in einer c++ datei den #define VERSION "1.2.34" in #define VERSION "1.2.35" umwandeln? dein regex der die zeile matcht is doch richtig. zum ersetzen kannst du replaceregexp verwenden, also:
<replaceregexp file="bla.cpp" match='#define VERSION "([0-9]+)\.([0-9]+)\.([0-9]+)"' replace='#define VERSION "${version.major}.${version.minor}.${build.number}"'/>
es gibt auch einen task buildnumber, der dir automatisch die proeprty build.number ausliest, inkrementiert und wieder in eine datei schreibt
-
Der Thread ist uralt.