Romero: search() mit mehreren Bedingungen

Hallöchen an Euch,

ich hab da ma ne kurze Frage: Kann ich eine Search()-Anweisung mit mehreren Bedingungen deklarieren?
Also, test könnte wie folgt aussehen:

1. var test = "A12399888000 - Insul. Area AB S.15";
2. var test = "A12399888000 - Insul. Area AB";
3. var test = "A12399888000 - S.15 AB";
4. var test = "A12399888000 - Insul. Area AB S.15-18";

test.search(/A12399888000//AB//S.15/) != -1

Sprich, dass ich mit einer Anweisung den kompletten String abfragen kann?
Ansonsten muss ich ja mehrere search()-Anweisungen hintereinander deklarieren.
Oder im vornherein mittels If-Anweisungen diverse search()-Anfragen selektieren, was aber das unnötig aufbläht. Und ich es eigentlich vermeiden wollte.

Daher die oben gestellte Frage.

LG Romero

  1. Lieber Romero,

    lass uns mal die Bestandteile untersuchen:

    A) Offensichtlich gibt es einen Bestandteil, der immer vorkommt: "A12399888000 - ".

    B) Wenn der in A) definierte Teil vorkommt, dann kann es einen Teil "Insul. Area AB" geben, muss aber nicht.

    C) Wenn A) und B) vorkommen, dann kann eine Ergänzung "S.15" vorkommen, muss aber nicht.

    D) Wenn A), B) und C) vorkommen, dann kann eine weitere Ergänzung "-18" vorkommen, muss aber nicht.

    E) Wenn A) vorkommt, B) aber nicht, dann folgt "S.15 AB".

    Das kann man mit einem regulären Ausdruck zusammenfassen. Offensichtlich willst Du mit der search()-Methode allein auf das Vorhandensein prüfen, wozu auch match() genügen würde. Also probiere ich jetzt ins Unreine einen regulären Ausdruck:

    var pattern = new RegExp(  
        // muss am Anfang vorkommen  
        "^A12399888000 - "  
        // Alternativen  
        + "("  
            // eine Alternative  
            + "S\.15 AB"  
        + "|"  
            // andere Alternative  
            + "Insul\. Area AB"  
            // mögliche Ergänzungen  
            + "("  
                + " S\.15"  
                // weitere mögliche Ergänzung innerhalb  
                + "(-18)?"  
            + ")?"  
        + ")$" // Ende  
    );  
      
    if (myString.match(pattern)) {  
        // gefunden!  
    }
    

    Hinweis: Code ist ungetestet!

    Liebe Grüße,

    Felix Riesterer.

    --
    "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
    1. Hy Felix,

      Das kann man mit einem regulären Ausdruck zusammenfassen. Offensichtlich willst Du mit der search()-Methode allein auf das Vorhandensein prüfen, wozu auch match() genügen würde. Also probiere ich jetzt ins Unreine einen regulären Ausdruck:

      var pattern = new RegExp(

      // muss am Anfang vorkommen
          "^A12399888000 - "
          // Alternativen
          + "("
              // eine Alternative
              + "S.15 AB"
          + "|"
              // andere Alternative
              + "Insul. Area AB"
              // mögliche Ergänzungen
              + "("
                  + " S.15"
                  // weitere mögliche Ergänzung innerhalb
                  + "(-18)?"
              + ")?"
          + ")$" // Ende
      );

      if (myString.match(pattern)) {
          // gefunden!
      }

      
      >   
      > Hinweis: Code ist ungetestet!  
      >   
      >   
      > Liebe Grüße,  
      >   
      > Felix Riesterer.  
        
      Ich werde das umgehend testen und hier mein Ergebnis dir/euch mitteilen.  
      Aber an RegExp hab ich in keinster Weise gedacht :)  
        
      Danke dir.  
        
      LG Romero
      
      1. Hy Felix,

        also ich muss sagen, diese Idee ist wirklich besser. Dennoch trifft diese Anfrage nur bedingt zu.

        Ich geb dir mal paar Beispiele. Kannst du mir da sagen, wo eventuell der Fehler liegen könnte, warum die Abfrage nicht funktioniert?

        Das Ziel ist es, aus einem Tabellenplatt in Spalte X die Zeilen nach und nach auszulesen, und wenn die Suchabfrage und der Zelleninhalt passen, so soll dann weitere Schritte erfolgen:

        for( var i = 0; i < Startzeile.length; i++ )  
        {  
           //-> alle ".", "-" & Leerzeichen werden entfernt  
           Bsp. 1: var Auslese_Bereich = "M25891010012 - S.13 A" //Blattname = S13  
           Bsp. 2: var Auslese_Bereich = "M25891015012 - S.13 D" //Blattname = S13  
           Bsp. 3: var Auslese_Bereich = "M25891095006 - INSUL. AREA IF S.13  " //Blattname = IF  
           Bsp. 4: var Auslese_Bereich = "M25891095006 - INSUL. AREA IF S.15  " //Blattname = IF  
           Bsp. 5: var Auslese_Bereich = "M25891020004 - INSUL. AREA FG  " //Blattname = FG  
          
           //hier die Suchabfrage, welche bei mir durch Variablen ersetzt sind  
           var Suchabfrage = new RegExp( "M25891010012 (oder eine andere der oberen Nummern)" + "(" + "INSULAREA" + "|" + "S13 (oder S15 / IF / FG)" + "(" + "A (oder D / IF / FG)" + "|" + "S13 (oder S15 / IF / FG)" + "(" + "AREA" + "|" + "S1315" + "|" + "S13 (oder S15 / IF / FG)" + "(" + "weitere Benennung" + ")?" + ")?" + ")?" + ")$" );  
          
           // die Wiederholungen einiger Werte kommen daher, da in dem Auslese_Bereich die S13 / S15 / IF / FG mittendrin oder am Ende stehen könnten  
          
           if( Auslese_Bereich.match(Suchabfrage) )  
           {  
              alert("gefunden");  
           };  
        };
        

        Soweit die Theorie. Bei den Beispielen 1 und 2 klappt die Abfrage hervorragend
        Aber bei den Beispielen 3 bis 5 greift er gar nicht, sprich, die Ausgabe alert("gefunden") wird mir nicht angezeigt. Erkennst du da grad den Fehler? Liegt es an den vielen doppelten Werten oder an der Länge des RegExp()'s?

        Hoffe kannst mir folgen :)

        LG Romero

        1. Hy Felix,

          Ich hab den Fehler gefunden.
          Bei meiner Deklaration hieß es wie folgt:

          var Suchabfrage = new RegExp( HTZ + "(" + Info1 + "|" + Blattname + "(" + Bereich_Teil1 + "|" + Sektion + "(" + Info2 + "|" + Info3 + "|" + Sektion + "(" + Bereich_Teil2 + ")?" + ")?" + ")?" + ")$" );

          Nun habe ich aber das Zeichen "$" am Ende der Kette durch ein "?" ersetzt:

          var Suchabfrage = new RegExp( HTZ + "(" + Info1 + "|" + Blattname + "(" + Bereich_Teil1 + "|" + Sektion + "(" + Info2 + "|" + Info3 + "|" + Sektion + "(" + Bereich_Teil2 + ")?" + ")?" + ")?" + ")?" );

          Und siehe da, er finden anhand der Variablen-Definition auch die genaue, in der Excel-Tabelle zu suchende Bezeichnung.

          LG Romero

          1. Aber eine Frage dazu hätte ich noch.

            Bei dem Suchstring
            var Suchabfrage = new RegExp( HTZ + "(" + Info1 + "|" + Blattname + "(" + Bereich_Teil1 + "|" + Sektion + "(" + Info2 + "|" + Info3 + "|" + Sektion + "(" + Bereich_Teil2 + ")?" + ")?" + ")?" + ")?" );
            und der Abfrage Auslese_Bereich.match(Suchabfrage) wird ja jeder Abfrageteil mit dem Suchstring überprüft und sobald was passt, die Zeichenfolge zurückgegeben.

            Überprüft da die Abfrage mit match() bis zur letzten Suchabfrage durch oder wird, sobald es das erste Mal passt, abgebrochen?

            Weil der Auslese_Bereich z.B. so aussehen könnte (das was gesucht werden sollte):
            M25891067|004|INSULAREA|IFFG| | => die "|" dienen als gedankliche Trennung um es lesbarer zu machen

            Meine Zelleninhalte sehen u.a. da wie folgt aus:

            M25891010|010|S13|A| |
            M25891095|006|INSULAREA|IF|S13|
            M25891067|004|INSULAREA|IFFG| |
            M25891026|004|INSULAREA|IF|S15|

            Meine Eingaben sind aber diese hier:

            M25891026|004|INSULAREA|IFFG| |

            Da ich u.a. auch Fehlerausgaben mit ausgeben möchte, ist für mich da wichtig, wenn der oben angegebene Suchstring (Suchabfrage) ALLE Kombinationen durchgeht.
            In diesem Falle gibt er anhand der Eingabe M25891026|004|INSULAREA|IFFG| | => M25891026|004|INSULAREA|IF|S15| als richtig. Was aber falsch wäre bzw. ist, denn keiner der (s.o.) Zelleninhalte trifft genau auf die Vorgaben zu.

            Hab ich da eine Möglichkeit, den Suchstring so zu definieren, dass er bis zur letzten Stelle durchsucht, und nur dann ein passendes Ergebnis liefert, wenn die Suchabfrage 100% auf die Eingabe passt?

            LG Romero

            PS: Hoffe meine Beschreibung könnt ihr nachvollziehen :)

            1. Hy ihr da :)

              ich bräuchte hier diesbezüglich nochmal eure Hilfe.
              Gerade wegen den Zeichen in den regulären Ausdrücken.

              Mein Beispiel sieht simpel gesprochen wie folgt aus:

              1. A_B_C_D => kann aber auch wie folgt aussehen:
              2. A_B_C
              3. A_B_C_D_E

              Meine Suchabfrage lautet da wie folgt:

              Suchabfrage = new RegExp("(^" + A + "(" + B1 + "|" + B2 + "(" + C1 + "|" + C2 + "(" + D1 + "|" + D2 + "|" + D3 + "(" + E + ")" + ")" + ")" + ")" + ")" );
              Wobei D1-D3 und E alternativ dazukommen könnten.

              Die auszulesende Zeile sieht wir folgt aus:

              1. A_B1_C1
              2. A_B2_C1_D2
              3. A_B1_C2_D1_E
              4. eventuelle weitere Kombinationen möglich.

              Meine Abfrage sieht so aus:

              var Ergebnis = auszulesene_Zeile.match(Suchabfrage)
              alert(auszulesende_Zeile + " -- " + Ergebnis)

              Das Problem was ich nun habe, dass er einige Kombinationen auslässt. Denn so wie ich es verstanden habe, geht er ja wie folgt durch:
              A + B1 + C1 + D1 + E
              A + B1 + C1 + D2 + E
              A + B1 + C1 + D3 + E
              A + B1 + C2 + D1 + E
              A + B1 + C2 + D2 + E
              ...
              A + B2 + C2 + D3 + E

              so lange, bis die Suchabfrage mit der auszulesenden Zeile zu 100% übereinstimmt, oder?

              Ich habe festgestellt, dass er, wenn die Alternativen innerhalb der Klammern drin sind, nur den letzten Eintrag nimmt. Wie kann ich das umgehen, dass er sowohl die erste als auch die weiteren Alternativen nimmt?

              Bin da ziemlich ratlos. Felix hat einen wunderbaren Anfang gemacht. Aber nun kommt da Erweiterungen hinzu, also das A-C immer fix sind, da ich mind. "3 Stellen habe", die überprüft werden müssen, und die anderen 2 nachstehenden alternativ dazukommen könnten.

              Hoffe auch diesmal, ihr könnt mir folgen.
              Bräuchte da dringend eure Hilfe.

              LG Romero

    2. Hy Felix,

      [code lang=javascript]var pattern = new RegExp(
          // muss am Anfang vorkommen
          "^A12399888000 - "
          // Alternativen
          + "("
              // eine Alternative
              + "S.15 AB"
          + "|"
              // andere Alternative
              + "Insul. Area AB"
              // mögliche Ergänzungen
              + "("
                  + " S.15"
                  // weitere mögliche Ergänzung innerhalb
                  + "(-18)?"
              + ")?"
          + ")$" // Ende
      );

      Kurze Frage hätte ich da noch. Da ich ja mit Variablen arbeite, ist da die Reihenfolge dieser Abfrage egal? Oder muss ich es genau so deklarieren, wie es "möglicherweise" vorkommen kann?

      LG Romero