Gustl: komme mit match oder test nicht weiter

(drucke mit perl den quelltext aus, deshalb die )

hi, also ich habe auf der einen seite 3 variablen und auf der anderen seite 9 variablen. dazu noch einen zähler, wobei der nebensache ist.

die 3 vars möchte ich jetzt je einzeln prüfen, ob sie in den anderen 9 vars vorkommen.

ich mache aus den 9 vars einen string:

var liste = \" \"+inf[10]+\" \"+inf[11]+\" \"+inf[12]+\" \"+inf[13]+\" \"+inf[14]+\" \"+inf[15]+\" \"+inf[16]+\" \"+inf[17]+\" \"+inf[18]+\" \";

diesen string möchte ich dann einzeln mit den 3 vars wortgenau vergleichen

if ( liste.match(/\b +var1+ \b/) ) { machwas }  
if ( liste.match(/\b +var1+ \b/) ) { machwas }  
if ( liste.match(/\b +var1+ \b/) ) { machwas }

das funzt nicht und ich steh voll aufm schlauch. ist liste schon verkehrt oder +var1+ der suchausdruck falsch eingebunden?

fehlermeldung kommt keine, ergebnis aber auch keins.

  • Gustl
  1. Moin Moin!

    if ( liste.match(/\b +var1+ \b/) ) { machwas }

    if ( liste.match(/\b +var1+ \b/) ) { machwas }
    if ( liste.match(/\b +var1+ \b/) ) { machwas }

    
    >   
    > das funzt nicht und ich steh voll aufm schlauch.  
      
    Nicht nur das. Deine Tastatur ist ein Fall für die Werkstatt. Zwei kaputte Shift-Tasten und auch noch eine kaputte Caps Lock-Taste. Leg beim PC-Dealer des geringsten Mißtrauens einen Zehner auf den Tisch, dann bekommst Du eine funkelnagelneue Tastatur, mit der Du auch endlich wieder Großbuchstaben schreiben kannst.  
      
    
    > ist liste schon verkehrt oder +var1+ der suchausdruck falsch eingebunden?  
    >   
    > fehlermeldung kommt keine, ergebnis aber auch keins.  
      
    Warum sollte es auch eine Fehlermeldung geben? Du suchst nach Wortgrenze, gefolgt von mindestens einem Leerzeichen, gefolgt von den Buchstaben "v", "a", "r", gefolgt von mindestens einer Ziffer "1", gefolgt von einem Leerzeichen, gefolgt von einer Wortgrenze.  
      
    Wenn Du einen regulären Ausdruck aus einem String basteln willst, sieh Dir die Konstruktoren des RegExp-Objekts an: <http://de.selfhtml.org/javascript/objekte/regexp.htm@title=SelfHTML>, [MDN](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp).  
      
    Alexander
    
    -- 
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
    
    1. Wenn Du einen regulären Ausdruck aus einem String basteln willst, sieh Dir die Konstruktoren des RegExp-Objekts an: http://de.selfhtml.org/javascript/objekte/regexp.htm@title=SelfHTML, MDN.

      das mach ich doch schon 3 tage lang, wieso glaubst du frag ich hier.

      ^^ danke sehr ^^

      wie muss ich die variable richtig einbinden?

      • Gustl
      1. wie muss ich die variable richtig einbinden?

        Ich habe dir oben Antwort gegeben. Wenn es jedoch nicht funktioniert mit den Variablen in den String einbinden, solltest du dir nochmal Alexanders Antwort zu Herzen nehmen. :)

        1. THEMA ERLEDIGT

          ich habe keine ahnung auf was für einem verflucht miesen trip ich da jetzt war. da brauchts weder ein new regex oder sonstwas, weder ein " noch ein ', noch ein + und schon gar keinen . ich hab einfach die slash´s (/ausdruck/) beibehalten, weil ichs von perl so gewohnt bin $wert zwischen die // zu schreiben.

          einfach so:

          if ( string.match(variable) ) { mach es }

          that.is.all

          manchmal ist es, als sei man im falschen film.

          • Gustl
          1. falls es noch wen interessiert:

            \b oder \egal wird bei mir als steuerzeichen erkannt, egal wie ich es maskiere. die korrekte notation für den regulären ausdruck müsste eigentlich so aussehen:

            ("\\b"+variable+"\\b")

            weil ich den quelltext mit perl drucke, also so:

            (\"\\b\"+variable+\"\\b\")

            in der ausgabe schaut das bei mir so aus:

            /[]wert[]/    ( [] sind viereckige kästchen )

            aussehen müsste es aber so:

            /\bwert\b/

            das ist alles unabhängig davon, ob ich nun ein neues regex anlege oder den wert direkt an match übergebe, denn auch im neuen regex muss ich die variable mit der wortgrenze \b flankieren.

            ich habs noch nicht anders versucht, aber ich glaube das liegt an der besonderheit, weil ich den quelltext mit perl drucke. deshalb kann ich wohl auch nicht nach diesem bug gurgeln. keine suchtreffer darüber.

            ich glaube auch nicht dass es am header liegt, aber ich experimentiere damit nochmal. der header für AJAX muss cahrset UTF8 sein (hab ich irgendwo gelesen). da ich im projekt ja AJAX verwende, werde ich mit dem header wohl keine andere wahl haben. ich hab aber eh keine ahnung obs daran liegen könnte.

            falls jemand noch was dazu weiss bitte melden. ansonsten leg ich die sache als unlösbar ab.

            • Gustl
            1. Moin,

              ... müsste eigentlich so aussehen

              ("\\b"+variable+"\\b")

              weil ich den quelltext mit perl drucke, also so:

              (\"\\b\"+variable+\"\\b\")

              nö, weil dass dann

              ("\b"+variable+"\b")

              ergibt. Also bitte die entsprechenden Backspaces auch maskieren. Einmal für Perl und einmal für JavaScript.

              1. hi micha,

                weil ich den quelltext mit perl drucke, also so:

                (\"\\b\"+variable+\"\\b\")

                nö, weil dass dann

                ("\b"+variable+"\b")

                ergibt. Also bitte die entsprechenden Backspaces auch maskieren. Einmal für Perl und einmal für JavaScript.

                micha, welche nicht unmaskierten backspaces siehst du denn da noch?

                (\"\\b\"+variable+\"\\b\")

                • Gustl
                1. Moin,

                    
                  (\"\\\\b\"+variable+\"\\\\b\")  
                  
                  

                  Es sei denn, dass man in Perl sowas nicht machen muss. Das sollte jedenfalls ein ("\b"+variable+"\b") als Ausgabe erzeugen, und genau das brauchst du doch in JavaScript.

                  Gruß

                  1. Moin,

                    tach.

                    ("\\b"+variable+"\\b")

                    
                    >   
                    > Es sei denn, dass man in Perl sowas nicht machen muss. Das sollte jedenfalls ein ("\\b"+variable+"\\b") als Ausgabe erzeugen, und genau das brauchst du doch in JavaScript.  
                      
                    so viele \\\\ verwirren mich. als gäbs die umsonst :-)  
                      
                    ein \ maskiert einen \ der einen \ maskiert? was ist das für ein kungfu?  
                      
                    ichs versuchs mal gelegentlich - zu kapieren.  
                      
                    oder ich tu´s eval uieren, oder wie der schnaps heisst. zum testen, dann weiss ich wenigstens obs grundsätzlich funzt.  
                      
                    schönen sonntag, ich geh jetzt pool spielen.  
                      
                      
                    - Gustl 
                    
  2. ich mache aus den 9 vars einen string:

    var liste = \" \"+inf[10]+\" \"+inf[11]+\" \"+inf[12]+\" \"+inf[13]+\" \"+inf[14]+\" \"+inf[15]+\" \"+inf[16]+\" \"+inf[17]+\" \"+inf[18]+\" \";

    diesen string möchte ich dann einzeln mit den 3 vars wortgenau vergleichen

    if ( liste.match(/\b +var1+ \b/) ) { machwas }

    if ( liste.match(/\b +var1+ \b/) ) { machwas }
    if ( liste.match(/\b +var1+ \b/) ) { machwas }

      
    Hi Gustl,  
      
    so wie ich es aus deinem Beispiel entnehme, wird nicht zwischen groß und kleinschreibung unterschieden und es gibt auch sonst nichts spezifisches, was RegEx nötig macht?  
      
    Dann habe ich die Funktion gefunden, dir dir vll. hilft:  
      
    function in\_array(item,arr) {  
        for(p=0; p < arr.length; p++)  
        {  
            if (item == arr[p])  
            {  
                return true;  
            }  
        }  
        return false;  
    }  
      
    Speichere deine 9 Variablen in einem Array anstatt in einem String. Dann rufe die Funktion auf, item ist gleich dem gesuchten Wert (einer deiner 3 vars) und arr ist der name des arrays mit den 9 variablen.  
      
    Ich hoffe das ist in deinem Sinne. Ansonsten kann ich dir die Antwort von Alexander nur nahe legen.
    
    1. so wie ich es aus deinem Beispiel entnehme, wird nicht zwischen groß und kleinschreibung unterschieden ...

      hi, nein, muss ich eh nicht. und darum gehts ja auch nicht. und dort wo alexander meint steht darüber gar nichts.

      ich muss nur wissen wie ich eine variable als suchausdruck interpretiere ... oder so ...

      .....   match(/'.+variable+.'/);  ......  
      .....   match(/.+variable+./);  ......  
      .....   match(/".+variable+."/);  ......  
      .....   match(/"+variable+"/);  ......
      

      ????????????????????????????????????

      wie um gottes namen geht das in js?

      in perl schreib ich das ganz einfach =~ (/$variable/) und schon läufts, das wars. aber für js finde ich nirgens eine erklärung dafür. ich google wirklich schon stunden ...

      • Gustl
      1. ich muss nur wissen wie ich eine variable als suchausdruck interpretiere ... oder so ...

        .....   match(/'.+variable+.'/);  ......

        .....   match(/.+variable+./);  ......
        .....   match(/".+variable+."/);  ......
        .....   match(/"+variable+"/);  ......

          
        Achso, sag das doch \*g\*  
          
        Ein kleines Beispiel mit "test":  
        ~~~javascript
          
        var ZuSuchenderWert = 34;  
        var RegExZahlen = /[\d]+/;  
        ZuSuchenderWert.match(RegExZahlen);  
          
        // oder test  
        RegExZahlen.test(ZuSuchenderWert);
        

        Ich hoffe ich bin noch nicht komplett eingerostet und es stimmt so.

        Also in deinem Falle keine der obigen Lösungen. ". ist PHP Verbindung, "+ kommt dem Javascript schon näher. Es ist bestimmt machbar, aber das würde es nur unnötig verkomplizieren.

      2. ich muss nur wissen wie ich eine variable als suchausdruck interpretiere

        new RegExp(variable)

  3. Hi Gustl,

    den regulären Ausdruck musst du zur Laufzeit erstellen.

      
    var suchtext = "hallo";  
    var regex    = new RegExp("\\b" + suchtext + "\\b");  
    
    

    so in etwa ...

    1. Hi Gustl,

      hi micha,

      den regulären Ausdruck musst du zur Laufzeit erstellen.

      var suchtext = "hallo";
      var regex    = new RegExp("\b" + suchtext + "\b");

        
      liege ich damit richtig, dass regex dann den suchausdruck enthält? wenn ich mir den inhalt von regex ausgeben lasse, dann schaut der so aus:  
        
      /[ein viereckiges kästchen]30[ein viereckiges kästchen]/ (das viereck kann ich hier nicht posten, weiss eh nicht was das für ein binärer wert sein soll.  
        
      wie auch immer müsste ich also regex dann an match übergeben?  
        
      `var ergebis = liste.match(regex);`{:.language-javascript}  
        
      das klappt aber nicht. da ich mir den quelltext ja mit perl erstelle, sieht mein testcode so aus (wegen der \):  
        
      ~~~javascript
        
      var liste = \" \"+inf[10]+\" \"+inf[11]+\" \"+inf[12]+\" \"+inf[13]+\" \"+inf[14]+\" \"+inf[15]+\" \"+inf[16]+\" \"+inf[17]+\" \"+inf[18]+\" \";  
        
      var neue = liste.replace(/undefined/g, \"\");  
        
      var irgendwas = \"30\";  
        
        var regex    = new RegExp(\"\\b\" + irgendwas + \"\\b\");  
        
        var ergebnis = neue.match(regex);  
        
        // $ ist funktion getElementById  
        \$\(\"schaumal\").innerHTML = \"Ausgabe: \" + ergebnis ;
      

      ich bekomme aber immer null zurück, natürlich auch wenn "30" in neue vorhanden ist.

      wenn ich hingegen einfach nur alles weglasse und:

      var ergebnis = neue.match(/30/);

      schreibe dann klappt das einwandfrei. aber dann wird nach 3 und 0 gesucht, oder? sobald ich aber:

      var ergebnis = neue.match(/\b30\b/);

      also mit wortgrenze, klappt es schon nicht mehr.

      ich weiss nicht, soll ich aufgeben? es muss doch wohl möglich sein, ganz einfach

      if ( liste.match(/\bvariable\b/) ) { dann tu was }

      zu schreiben. aber das geht nicht und jetzt lauf ich im dunklen rum.

      • Gustl