danke für Deine Frage, ich habe heute wieder was neues gelernt:
Matlab kennt keine Referenzen auf verschachtelte Klammern in regulären Ausdrücken
Zu Deinem Problem:
sollten immer nur zwei Fünfstelligen Zahlen hintereinander gleich sein, entfernt
folgender regulärer Ausdruck jeweils den 2. Fünferblock:
Auf Muster in Klammern (hier also fünf Ziffern \d{5}) kann im Suchausdruck mit
\1, \2, ... auf die 1., 2. usw. Klammer verwiesen werden und im Ersetzungstext mit $1, ...
Es wird also nach fünf Ziffern, Unterstrich, 1 oder mehr Ziffern, Minus, den ersten fünf Ziffern, Unterstrich gesucht und dieser Teilstring durch die ersten beiden Ziffernblöcke ersetzt.
danke für Deine Frage, ich habe heute wieder was neues gelernt:
Matlab kennt keine Referenzen auf verschachtelte Klammern in regulären Ausdrücken
Zu Deinem Problem:
sollten immer nur zwei Fünfstelligen Zahlen hintereinander gleich sein, entfernt
folgender regulärer Ausdruck jeweils den 2. Fünferblock:
Auf Muster in Klammern (hier also fünf Ziffern \d{5}) kann im Suchausdruck mit
\1, \2, ... auf die 1., 2. usw. Klammer verwiesen werden und im Ersetzungstext mit $1, ...
Es wird also nach fünf Ziffern, Unterstrich, 1 oder mehr Ziffern, Minus, den ersten fünf Ziffern, Unterstrich gesucht und dieser Teilstring durch die ersten beiden Ziffernblöcke ersetzt.
Hallo Sirius,
gerne geschehen für die Frage. Fällt die unter " Du bist der Matlab-Profi schlechthin und brauchst neue Herausforderungen?"
Was meinst du bitte mit:
Zitat:
Matlab kennt keine Referenzen auf verschachtelte Klammern in regulären Ausdrücken
Das ist für mich zu professionell Wo sind denn verschachtelte Klammern oder meinst du die () in den regulären Ausdrücken?
Warum ? Können das andere Sprachen?
Mal sehen, ob ich das trotz deiner Erklärung verstehe. Sorry.
(\d{5}) sucht die fünfstelligen Nummern.
_ = Unterstrich nach den 5stelligen Zahlen.
\d ist wieder eine Nummer und das Plus bedeutet eine Zahl oder mehrere.
\1 ist wohl der erste Match? Ah, meint dann -\1 die Entfernung des ersten Treffers? Warum ist damit automatisch die fünfstellige Zahl gemeint?
Moment, diese regexp zerteilt den String in Teilstrings (\d{5})_(\d+) und von denen ziehst du immer den ersten Treffer ab? Mir erscheint noch nicht ganz klar woher die Funktion weiß, was $2 ist.
Was meinst du bitte " wird ersetzt durch die ersten beiden Ziffernblöcke"?
Hier noch einmal das Beispiel:
filename =
39086_1-39086_9-39084_1-39084_9-39088_1-39088_9
Du suchst also nach 39086_1-39086_ mit '(\d{5})_(\d+)-\1_', ? Aber wie verschwindet dann die zweite -39086 und die 9 bleibt übrig?
Entschuldigung fürs "laute" Denken und nochmals vielen Dank für die Hilfe. Echt cool.
Again, was für eine krasse Lösung. Da wäre ich ja ewig nicht drauf gekommen. Vielen Dank!
Darf ich mal sagen, daß die Matlab-Hilfe bei Regexp mir irgendwie unübersichtlich erscheint?
Reguläre Ausdrücke sind ein sehr mächtiges Werkzeug und können entsprechend
komplex werden. Es gibt sie auch nicht nur in Matlab sondern für fast jede
Programiersprache, jedoch mit unterschiedlichen Dialekten.
Dein Dateiname
39106_001-39106_002-39098_001-39098_009-39100_001-39100_090.dat
hat ja die Form
#####_###-#####_###- ... .dat
oder als regulärer Ausdruck, der genau dieses Muster beschreibt:
(\d{5}_\d{3}-)*\d{5}_\d{3}\.dat
also abwechselnd 5 bzw. 3 Ziffern.
Geklammerte Asudrücke werden zum Wiederverwenden gespeichert:
Bei (\d{5})_(\d{3}) stehen in \1 die Zeichen in den ersten Klammern
und in \2 die Zeichen in den zweiten Klammern.
Das Suchmuster (\d{5})_(\d{3})-\1 wird also nur dann gefunden, wenn sich
die ersten fünf Ziffern zum Schluß wiederholen.
39106_001-39106 passt genau in dieses Muster
\1 = 39106
\2 = 001
Wird Text mit regexprep ersetzt kann man die gefundenen Klammerausdrücke
auch in den Ersetzungstext mit einbauen, jetzt aber mit $1 bzw. $2
$1_$2 wird damit zu 39106_001. Ein $2/$1 ergäbe 001/39106.
Da aber die gesamte gefundene Zeichenfolge durch den neuen Text ersetzt wird,
verschwindet einfach die zweite 5er-Zahl:
39106_001-39106 -> 39106_001
Ich habe eine weitere Frage zu regexp bitte.
Ich habe entweder file names, z.B.
agbehblank_00001r3.fio
agbehblank_00001r15.fio
oder
agbeshortstd_00001.fio
Kann man vielleicht immer die Zahlen vor dem .fio irgendwie rausbekommen?
Das wären in diesem Fall 3, 15 und 1.
Und kann man zuvor _00001r3 oder _00001 wegsplitten, unabhängig wieviele _ man vorher hat? Ich hab es mit _ als Orientierung versucht, aber das klappt nicht. Wenn man z.B. dann ba_buffer_00003r5.fio hat, kam als Ergebnis nur ba raus, weil gleich der erste _ gefunden wurde.
In der Zwischenzeit spiele ich mal weiter rum mit regexp.
Vielen Dank.
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.