tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von HonniCilest
  • 1 Beitrag von deepthroat
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
704
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    equestenebrarum equestenebrarum ist offline Mitglied Bronze
    Registriert seit
    Apr 2005
    Beiträge
    26
    Hallo, ich hoffe es passt in diesen Bereich.

    Ich habe hier einen Texteditor, welcher das Suchen und Ersetzen mittels regulärer Ausdrücke unterstützt (Smultron für Mac OS X). Klappt auch sehr gut, nur diese vergleichsweise einfach anmutende Aufgabe beschert mir graue Haare:

    Gesucht ist ein regulärer Ausdruck, welcher das erste Auftreten eines Zeichens (in meinem Fall des Tabulator-Zeichens) bezeichnet (Standardverhalten meines Editors ist greedy).

    Eine Beispiel-Zeile:

    Code :
    1
    
    3454    2920    8139    1830

    Ich möchte in derartigen Zeilen nur das erste Tabulator-Zeichen gegen eine andere Zeichenkette austauschen. Das muss doch mittels regulärem Ausdruck irgendwie zu machen sein, oder?

    Zusatzfrage dazu, überhaupt nicht brennend: Angenommen, ich wollte nur das zweite Tabulator-Zeichen austauschen ...

    Help!
     

  2. #2
    Avatar von Navy
    Navy Navy ist offline Freiwillige Serverwehr
    tutorials.de Administrator
    Registriert seit
    Jul 2003
    Ort
    Montreal (Quebec)
    Beiträge
    1.667
    Code :
    1
    
    sed 's/^\(\S\)*\s\(.*\)$/\1a\2/g'

    bzw:

    Code :
    1
    
    ^(\S)*\s(.*)$

    das matcht die ganze Zeile, über die Klammer kannst Du das erste Whitespace-Vorkommen ersetzen.
     
    Navy

    --
    Echtzeithilfe unter irc.tutorials.de #tutorials.de

  3. #3
    Avatar von HonniCilest
    HonniCilest HonniCilest ist offline Mitglied Platin
    Registriert seit
    Jun 2009
    Ort
    Java Insel
    Beiträge
    501
    Eigentlich müsste es auch so gehen:
    Code :
    1
    
    (?=^(\t)*)\t
    Zur Erklärung der Theorie in meinem Kopf :
    Der Tabulator "\t" ist gesucht. Da es der erste Tabulator ist darf kein anderes Tablutorzeichen vorausgehen, d.h. x beliebige Zeichen ungleich \t ("^(\t)*"). Der Klammerausdruck (?= ) wird als "positive look-ahead assertion" bezeichnet. So kann der Ausdruck als Bedingung zwar angeben, wird im Ergebnis jedoch nicht mit aufgeführt. Achtung nicht jede Sprache versteht look-around assertion, somit eventuell dein Programm nicht, aber du kannst es ja ausprobieren.
    equestenebrarum bedankt sich. 
    Jeder Fehler, aus dem wir lernen, ist ein Erfolg...
    ...Aber mach' nicht den Fehler, nicht aus deinen Fehlern zu lernen.

  4. #4
    equestenebrarum equestenebrarum ist offline Mitglied Bronze
    Registriert seit
    Apr 2005
    Beiträge
    26
    Zunächst vielen Dank für eure Antworten.

    Zitat Zitat von Navy Beitrag anzeigen
    [CODE]
    Code :
    1
    
    ^(\S)*\s(.*)$

    das matcht die ganze Zeile, über die Klammer kannst Du das erste Whitespace-Vorkommen ersetzen.
    Zur Verdeutlichung, ich habe zwei Eingabefelder, eines für den Suchstring als regulären Ausdruck, und eines für den Ersetzungstext. Mir ist nicht klar, was du mit "über die Klammer ersetzen" meinst? Ich selektiere ja in dem Beispiel auf komplizierte Weise einfach die ganze Zeile.

    @HonniCilest: Derartige Positive look-ahead assertions sind äußerst praktisch, damit gäbe es eine Reihe von Lösungen für mein Problem. Leider werden Sie von meinem Editor tatsächlich nicht unterstützt und auch nicht von einem weiteren, den ich ausprobiert habe.

    Wenn jemanden einen freien Editor für Mac OS X empfehlen kann, der diese Funktionalität bietet?

    Ein Variablen-Konzept gibt es auch nicht in regulären Ausdrücken, oder? Idee wäre, im Ersetzungstext einen im Suchstring-Ausdruck spezifizierten Teil wieder einzufügen. Dann wär's auch kein Problem.

    Falls die Geschichte mit regulären regulären Ausdrücken nicht machbar ist, werde ich mir morgen früh ein AppleScript - ohne reguläre Ausdrücke, mit String-Operationen - für dieses spez. Problem basteln. Konnte mir bloß überhaupt nicht vorstellen, dass es auf ein derartig einfach gestricktes Standardproblem keine einfache Standardantwort gibt.
     

  5. #5
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von equestenebrarum Beitrag anzeigen
    Zur Verdeutlichung, ich habe zwei Eingabefelder, eines für den Suchstring als regulären Ausdruck, und eines für den Ersetzungstext. Mir ist nicht klar, was du mit "über die Klammer ersetzen" meinst? Ich selektiere ja in dem Beispiel auf komplizierte Weise einfach die ganze Zeile.
    Ist es denn nicht möglich im Ersetzungstext Referenzen zu den vorher selektierten Gruppen anzugeben? Üblicherweise mit \1 \2 usw.

    Meine Suche ergab, das Smultron die ICU reg. Expression Engine verwendet. Diese unterstützt eigentlich alle üblichen look* assertions.

    Das Problem mit dem Ausdruck von Honnicliest ist bloss das dieser nicht funktionieren kann. Erstens müßte man die Zusicherung negieren - es sollen ja gerade keine \t vor dem zu selektierenden \t sein. Außerdem bewegt eine Lookahead Assertion die Eingabe nicht weiter, so das die Eingabe immer noch am Zeilenanfang steht und nicht bei dem ersten \t - und somit erfolgt auch keine Übereinstimmung.

    Weiterhin verwendet ICU für Referenzen auf die Gruppen das Zeichen $. Also sollte der Ausdruck "^([^\t]*)\t" mit der Ersetzung "$1X" eigentlich das gewünschte Ergebnis bringen. (hierbei wird das erste \t durch ein X ersetzt).

    Gruß

    \edit: Um das zweite Zeichen zu selektieren: "^([^\t]*\t[^\t]*)\t".
    Geändert von deepthroat (24.11.11 um 14:51 Uhr)
    equestenebrarum bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  6. #6
    equestenebrarum equestenebrarum ist offline Mitglied Bronze
    Registriert seit
    Apr 2005
    Beiträge
    26
    Hell yeah! Du bist mein Held. Es funktioniert genau, wie du sagst. Das man im Ersetzungstext Referenzen verwenden kann, war mir neu, die Smultron-Hilfe zeigt so gut wie nix an. Hab mir gerade den ICU User Guide an die Wand gepappt, das macht das Programm 1000 x wertvoller für mich. Also: 1000 Dank!

    *happy*
     

Ähnliche Themen

  1. Regulärer Ausdruck für Domäne gesucht
    Von jaegerschnitzel im Forum Coders Talk
    Antworten: 3
    Letzter Beitrag: 15.04.08, 17:31
  2. Regulärer Ausdruck für Domäne gesucht
    Von jaegerschnitzel im Forum PHP
    Antworten: 0
    Letzter Beitrag: 15.04.08, 15:26
  3. Regulärer Ausdruck gesucht
    Von DannyP im Forum PHP
    Antworten: 1
    Letzter Beitrag: 25.01.07, 23:33
  4. Regulärer Ausdruck gesucht
    Von guliver im Forum Sonstige Sprachen
    Antworten: 9
    Letzter Beitrag: 21.06.06, 14:06
  5. (AWK) Regulärer Ausdruck gesucht
    Von takidoso im Forum Sonstige Sprachen
    Antworten: 13
    Letzter Beitrag: 09.06.06, 16:05

Stichworte