Lukas: Hilfe bei Regulärem Ausdruck

Hi zusammen!

Ich benötige Hilfe bei einem Problem mit einem Regulären Ausdruck. Und zwar möchte ich alle Buchstaben (es können nur Buchstaben enthalten sein) aus einem String herausfiltern. Dabei sollen aber einige Buchstaben berücksichtigt werden.

Mein regulärer Ausdruck sieht so aus (wobei a, s, und d die zu berücksichtigenden Buchstaben sind): [^asd]

Der String, der durchsucht werden soll sieht so aus: asdhalloasd. Nun möchte ich, dass hallo per Replace entfernt und durch Unterstriche ersetzt wird (Ergebnis = asd_____asd).

Könnt ihr mir sagen, wie der reguläre Ausdruck aussehen muss, damit das so funktioniert?

Vielen Dank und viele Grüße,
Lukas

PS: Ich verwende VB6. Aber das macht doch nichts, weil ein regulärer Ausdruck unter VB6 gleich funktioniert, wie unter PHP oder Perl, oder?

  1. Hi zusammen!

    Ich benötige Hilfe bei einem Problem mit einem Regulären Ausdruck. Und zwar möchte ich alle Buchstaben (es können nur Buchstaben enthalten sein) aus einem String herausfiltern. Dabei sollen aber einige Buchstaben berücksichtigt werden.

    Schon diese Schilderung ist wirr.

    Mein regulärer Ausdruck sieht so aus (wobei a, s, und d die zu berücksichtigenden Buchstaben sind): [^asd]

    Also
    '¬§||¢¬§|§' =~ /[^asd]/ and print "TRUE!\n"

    Der String, der durchsucht werden soll sieht so aus: asdhalloasd.

    Also garantier immer 'asdhalloasd'
    und nicht
    "aaahallosssssss"
    "aaa2546924||¢¬|¬73907sssssss"
    "a0a"

    Nun möchte ich, dass hallo per Replace entfernt und durch Unterstriche ersetzt wird (Ergebnis = asd_____asd).

    Wörtlich 'hallo' oder '485&(&&6'

    Was du nämlich andeutest ist s/([asd])+hallo\1/$1_____$1/

    Vielleicht meinst du aber:
    s/([asd])+[^asd]+\1/$1________________________________________$1/

    Könnt ihr mir sagen, wie der reguläre Ausdruck aussehen muss, damit das so funktioniert?

    Nur wenn du die Kunst der guten Problembeschreibung pflegst.

    mfg Beat

    --
                     /|
      <°)))o><      / |    /|
                ---- _|___/ |     ><o(((°>
               OvVVvO    __ |         ><o(((°>
    <°)))o><  /v    v\/  |
     <°)))o>< ^    ^/_/_         ><o(((°>
               ^^^^/___/
    ><o(((°>    ----       ><o(((°>
       <°)))o><                      ><o(((°>o
    1. Hi!

      Ich benötige Hilfe bei einem Problem mit einem Regulären Ausdruck. Und zwar möchte ich alle Buchstaben (es können nur Buchstaben enthalten sein) aus einem String herausfiltern. Dabei sollen aber einige Buchstaben berücksichtigt werden.

      Schon diese Schilderung ist wirr.

      Also: Ich habe einen String. Dieser String enthält nur Buchstaben. Nun möchte ich alle Buchstaben, bis auf ein paar bestimmte, gematcht bekommen.

      Mein regulärer Ausdruck sieht so aus (wobei a, s, und d die zu berücksichtigenden Buchstaben sind): [^asd]

      Also
      '¬§||¢¬§|§' =~ /[^asd]/ and print "TRUE!\n"

      Wie bitte? Das verstehe ich nicht. Ich meinte: Mein regulärer Ausdruck sieht bis jetzt so aus: /[^asd]/. Allerdings funktioniert er ja nicht.

      Der String, der durchsucht werden soll sieht so aus: asdhalloasd.

      Also garantier immer 'asdhalloasd'
      und nicht
      "aaahallosssssss"
      "aaa2546924||¢¬|¬73907sssssss"
      "a0a"

      Auch das verstehe ich nicht. Ich meinte: Mein String ist zum Beispiel "Donaudampschifffahrt". Und dann sollen alle Buchstaben bis auf "a" und "f" durch Unterstriche (pro Buchstabe ein Unterstrich) ersetzt werden (das ganze ist für HangMan. Das gesuchte Wort ist versteckt und bei jedem erratenem Buchstaben werden die richtigen Buchstaben aufgedeckt; dann ist es vielleicht besser zu verstehen warum ich das ganze will)

      Nun möchte ich, dass hallo per Replace entfernt und durch Unterstriche ersetzt wird (Ergebnis = asd_____asd).

      Wörtlich 'hallo' oder '485&(&&6'

      Wie bitte? Wenn du meinst, ob auch "485&(&&6" im String vorkommen kann, dann nein. Nur Buchstaben.

      Was du nämlich andeutest ist s/([asd])+hallo\1/$1_____$1/

      Vielleicht meinst du aber:
      s/([asd])+[^asd]+\1/$1________________________________________$1/

      Ich weiß nicht was diese Ausdrücke machen. Aber ich muss nicht im regulären Ausdruck selber replacen. Das mache ich mit der VB6-Funktion Replace. Ich brauche nur einen regulären Ausdruck, der mir die gesuchten Buchstaben findet.

      Könnt ihr mir sagen, wie der reguläre Ausdruck aussehen muss, damit das so funktioniert?

      Nur wenn du die Kunst der guten Problembeschreibung pflegst.

      Hier nochmal eine komplette Beschreibung: Ich programmiere mit VB6 Hangman (Galgenmännle). Das Spiel kennt sicherlich jeder. Es muss ein Wort erraten werden, indem einzelne Buchstaben erraten werden. Tippt der User auf einen falschen Buchstaben wird an der Figur ein Strich mehr gemalt. Ist die Figur fertig gemalt, dann hat der Spieler verloren.
      Das gesuchte Wort ist "SELFHTML". Angezeigt wird aber "_ _ _ _ _ _ _ _". Tippt der Spieler jetzt auf ein "L" dann sollen diese eingesetzt werden: "_ _ L _ _ _ _ L"

      Und dieses Einsetzen soll der reguläre Ausdruck erledigen. Dazu soll er bspw. alle Buchstaben bis auf "L" (siehe oberes Bsp) durch Unterstriche ersetzen.

      Ich hoffe es ist so verständlich.

      Viele Grüße, Lukas

      1. Also: Ich habe einen String. Dieser String enthält nur Buchstaben. Nun möchte ich alle Buchstaben, bis auf ein paar bestimmte, gematcht bekommen.

        Was heisst: "match"
        Ein Suchmuster wird fündig, oder es wird nicht fündig bezüglich einem zu durchsuchenden String. Aber man kann nicht davon sprechen, dass einzelne Elemente in der RE ge-matcht haben, andere hingegen nicht.

        Mein regulärer Ausdruck sieht so aus (wobei a, s, und d die zu berücksichtigenden Buchstaben sind): [^asd]
        Also
        '¬§||¢¬§|§' =~ /[^asd]/ and print "TRUE!\n"
        Wie bitte? Das verstehe ich nicht. Ich meinte: Mein regulärer Ausdruck sieht bis jetzt so aus: /[^asd]/. Allerdings funktioniert er ja nicht.

        Die RE sagt: finde etwas das weder ein a noch ein s noch ein d ist.
        folgende Beispiele werden durch die RE gematcht:
        '0a'
        'asd0asd'
        'd00000000d'
        'd0000000000000'
        ' asd'
        'das '

        In jedem Fall wird etwas im String gefunden, das die Anforderung "sei weder a noch d noch s" befriedigt.

        Der String, der durchsucht werden soll sieht so aus: asdhalloasd.
        Also garantier immer 'asdhalloasd' ......
        Auch das verstehe ich nicht. Ich meinte: Mein String ist zum Beispiel "Donaudampschifffahrt". Und dann sollen alle Buchstaben bis auf "a" und "f" durch Unterstriche (pro Buchstabe ein Unterstrich) ersetzt werden (das ganze ist für HangMan. Das gesuchte Wort ist versteckt und bei jedem erratenem Buchstaben werden die richtigen Buchstaben aufgedeckt; dann ist es vielleicht besser zu verstehen warum ich das ganze will)

        Ach so!
        Du suchst also:
        "Donaudampfschifffahrt" =~ s/[asd]/_/g
        sprich : ersetze jedes a, s oder d durch ein _
        "Don_udamp_chifffahrt"

        "Donaudampfschifffahrt" =~ s/[^asd]/_/g
        sprich : ersetze jedes NICHT a, s oder d durch ein _
        wird "___a_da__s_______a___"

        oder soll es case insensitive sein?
        "Donaudampfschifffahrt" =~ s/[^ASDasd]/_/g
        oder
        "Donaudampfschifffahrt" =~ s/[^asd]/_/gi
        wird "D__a_da___s______a___"

        Wie bitte? Wenn du meinst, ob auch "485&(&&6" im String vorkommen kann, dann nein. Nur Buchstaben.

        Definiere Buchstaben.
        Wenn du einen String ausschliessen willst, der Nicht_Deine_Buchstaben enthält, dann musst du das sagen.

        my $legal_letter_string_pattern = re/[1]+$/

        und

        $string =~ $legal_letter_string_pattern and
            $string =~ s/[ASDasd]/_/g;

        Hier nochmal eine komplette Beschreibung: Ich programmiere mit VB6 Hangman (Galgenmännle). Das Spiel kennt sicherlich jeder.

        ja
        Also wird $string von dir vorgegeben!
        Insofern bist du selbst verantwortlich, was für Worte für Hangman in Frage kommen.
        "WinXP" "HTML 4.01" "Dr.Mabuse" "Johannes-Evangelium"

        Es muss ein Wort erraten werden, indem einzelne Buchstaben erraten werden. Tippt der User auf einen falschen Buchstaben wird an der Figur ein Strich mehr gemalt. Ist die Figur fertig gemalt, dann hat der Spieler verloren.
        Das gesuchte Wort ist "SELFHTML". Angezeigt wird aber "_ _ _ _ _ _ _ _". Tippt der Spieler jetzt auf ein "L" dann sollen diese eingesetzt werden: "_ _ L _ _ _ _ L"
        Und dieses Einsetzen soll der reguläre Ausdruck erledigen. Dazu soll er bspw. alle Buchstaben bis auf "L" (siehe oberes Bsp) durch Unterstriche ersetzen.
        Ich hoffe es ist so verständlich.

        Ja, das nenne ich jetzt eine Problembeschreibung.

        Jetzt ist es natürlich so. dass du im Grunde nicht [asd] ersetzen willst,
        sondern die Zeichenklasse, die in der Spielrunde aktuell besteht.

        Das heisst: du musst einen String erstellen, der alle bisher eingegeben Buchstaben enthält

        my $user_selected_chars = ''; dieser soll die selektierten Buchstaben enthalten.
        Sortierung spielt keine Rolle

        Achtung immer inputprüfung machen.
        $user_input_char =~ /[2]$/ or error('blöder Input');

        $user_selected_chars .= $user_input_char;
        hänge das Eingabezeichen an die bisherigen chars.

        my $hangman_word_to_display = "Donaudampschiffahrt";

        $hangman_word_to_display =~ s/[^$user_selected_chars]/_/gi;

        Das ist natürlich alles Perl Syntax. Übersetzen musst du es selbst.

        mfg Beat

        --
           <°)))o><                      ><o(((°>o

        1. ^A-Za-z0-9_ ↩︎

        2. A-Za-z0-9- ↩︎

        1. Hi!

          Vielen Dank für deine schnelle und ausführliche Hilfe! Wenn ich mit Perl arbeiten würde, wäre ich jetzt überglücklich. So stehe ich ich jetzt noch vor folgendem Problem :)

          Das ist natürlich alles Perl Syntax. Übersetzen musst du es selbst.

          In der Hoffnung, dass noch irgendwo ein VB6-Experte rumsurft, der mir helfen könnte.

            
              Dim word As String  
              word = "Donaudampfschifffahrt"  
              With New RegExp  
                  .Pattern = "s/[^" & clickedLetters & "]/_/gi"  
                  .IgnoreCase = True  
            
                  textbox.Text = .Replace(word, "_")  
              End With  
          
          

          Mit diesem regulären Ausdruck wird mir nichts ersetzt. Woran liegt das? Könntet ihr mir da vielleicht weiterhelfen?

          Vielen Dank an Beat und eventuelle witere Helfer! Viele Grüße, Lukas

          PS: Ich suche mal. Wenn ich irgendwie weiterkomme, dann melde ich mich hier wieder.

          1. Das ist natürlich alles Perl Syntax. Übersetzen musst du es selbst.
            In der Hoffnung, dass noch irgendwo ein VB6-Experte rumsurft, der mir helfen könnte.

            Dim word As String
                word = "Donaudampfschifffahrt"
                With New RegExp
                    .Pattern = "s/[^" & clickedLetters & "]/_/gi"

            hier steckt wohl schon zuviel Information.
            gi sagen global und caseignorant in Perl.
            s/// ist ein ersetzungspattern. Den zu ersetzenden teil definierst du in VB6 aber anders.

            .Pattern = "[^" & clickedLetters & "]"

            jetzt suchen wir natürlich etwas in der Art
                      .MatchAll = True
            falls es sowas in VB6 gibt.

            .IgnoreCase = True

            textbox.Text = .Replace(word, "_")
                End With

            
            >   
            > Mit diesem regulären Ausdruck wird mir nichts ersetzt. Woran liegt das? Könntet ihr mir da vielleicht weiterhelfen?  
              
            mfg Beat
            
            -- 
            
            ><o(((°>        ><o(((°>  
            
               <°)))o><                      ><o(((°>o  
            
            
            1. Hey!

              Vielen vielen Dank!

              Ich habe die Lösung dank dir gefunden!

              With New RegExp
                      .Pattern = "[^" & clickedLetters & "]"
                      .Global = True ' Das hier macht den großen Unterschied
                      .IgnoreCase = True

              textbox.Text = .Replace(word, "_")
                  End With

              Vielen Dank und viele Grüße!

              Lukas

          2. Hi!

            Jetzt habe ich noch eine Frage: Warum funktioniert nicht folgendes?

              
                Dim word As String  
                word = "Donaudampfschifffahrt"  
                With New RegExp  
                    .Pattern = "[^" & clickedLetters & "]"  
                    .IgnoreCase = True  
              
                    textbox.Text = .Replace(word, "_")  
                End With  
            
            

            Die eckigen Klammern geben eine Gruppe von Zeichen an. Und ^ dreht das ganze um.

            Also steht doch da: Finde alles außer den Buchstaben, die in der Gruppe stehen.

            Wo liegt hier der Fehler?

            @Beat: Weshalb sind in deiner Lösung noch die anderen Zeichen?

            Viele Grüße,
            Lukas

  2. Hallo Lukas!

    Wie Beat bereits anmerkte, deine Schilderung ist wirr.

    Du willst aus »asdhalloasd« »asd_____asd« machen und nicht etwa »asd_a___asd«. Also geht es dir nicht um einzelne Zeichen, sondern um die Zeichenkette »asd«.

    PS: Ich verwende VB6. Aber das macht doch nichts, weil ein regulärer Ausdruck unter VB6 gleich funktioniert, wie unter PHP oder Perl, oder?

    Dann verwendest du also VBS-RegEx-Komponente, hierzu gilt:
    Der VBS-RegEx-Dialekt umfasst einerseits alle zentralen Aspekte des allgemeinen Konzeptes von Regulären Ausdrücken und hat andererseits keine wirklichen Besonderheiten. Er eignet sich daher gut zum Lernen von Regulären Ausdrücken.
    Fortgeschrittenere Syntaxelemente, wie beispielsweise Lookbehinds, kennt VBS allerdings nicht.

    Gruß Uwe

    1. Hallo Lukas!

      Wie Beat bereits anmerkte, deine Schilderung ist wirr.

      Du willst aus »asdhalloasd« »asd_____asd« machen und nicht etwa »asd_a___asd«. Also geht es dir nicht um einzelne Zeichen, sondern um die Zeichenkette »asd«.

      Oh. Mein Fehler. Es geht mir um die einzelnen Buchstaben und nicht um die Zeichenkette. Sorry.

      PS: Ich verwende VB6. Aber das macht doch nichts, weil ein regulärer Ausdruck unter VB6 gleich funktioniert, wie unter PHP oder Perl, oder?

      Dann verwendest du also VBS-RegEx-Komponente, hierzu gilt:
      Der VBS-RegEx-Dialekt umfasst einerseits alle zentralen Aspekte des allgemeinen Konzeptes von Regulären Ausdrücken und hat andererseits keine wirklichen Besonderheiten. Er eignet sich daher gut zum Lernen von Regulären Ausdrücken.
      Fortgeschrittenere Syntaxelemente, wie beispielsweise Lookbehinds, kennt VBS allerdings nicht.

      Danke für die Infos. Dann ist es ja gut. Ich denke nicht, dass ich fortgeschrittene Syntaxelemente brauchen werde.

      Viele Grüße,
      Lukas