Announcement

Collapse
No announcement yet.

[MSSQL/RegEx] Wie würdet ihr das umsetzen?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • [MSSQL/RegEx] Wie würdet ihr das umsetzen?

    Hi,

    Ich habe in der Datenbank einige Datensätze, bei denen die Mail so aussieht:
    Code:
    acbbaa93fa4b45eaa1cc3a4b29d01d8b_hans.wurst@example.com
    Der Hash vor dem Underscore soll nun gefiltert werden, sprich ich möchte bei meinem Export diese Emails rausfiltern.
    Mit vernünftiger RegEx-Engine wäre das kein Problem, sollte in etwa hiermit funktionieren:
    Code:
    [0-9a-z]{32}\_%
    Dat kann er natürlich nicht...
    Also werde ich da jetzt auf die Schnelle ein Script über die exportierte Liste laufen lassen.

    Dennoch würde mich interessieren, wie ihr sowas umsetzen würdet?

    Danke
    PHP rocks!
    Eine Initiative der PHP Community

  • #2
    http://www.regexplanet.com/advanced/java/index.html

    In Oracle gibt es REGEXP_REPLACE
    Ausdruck wäre dort
    [0-9a-z]{32} (wenn der _ erhalten bleiben soll)
    Kenn jetzt die MSSQL Engine nicht, aber der _ ist nicht zu entwerten und das % dient zu?
    Zuletzt editiert von Christian Marquardt; 05.09.2018, 16:25.
    Christian

    Comment


    • #3
      Hi Christian, es handelt sich um den MSSQL-Server, sprich T-SQL von M$.
      Das % match beliebige Zeichen beliebiger Anzahlen und das ist auch schon alles, was da möglich ist.
      _ wäre sogar unescaped auch ein belibiges Zeichen und genau das wichtigste für diesen Fall, das {32} kann er gar nicht.

      Ich könnte jetzt 32x [0-9a-z] hintereinander schreiben, aber da weigere ich mich
      PHP rocks!
      Eine Initiative der PHP Community

      Comment


      • #4
        Wenn der Hash reproduzierbar wäre, ginge es natürlich ganz simpel mit der Hashfunktion und einem matchenden Join via like.
        Aber ich fürchte, das ist ein Passwort oder sowas.

        Ach und die 32 Stellen plus Unterstrich reichen nicht als Kriterium für ein Abschneiden?
        Gruß, defo

        Comment


        • #5
          Gute Frage, wie sähe dann die Bedingung aus? Mit CHARINDEX kann ich wohl prüfen, ob an Stelle 33 ein _ liegt, aber das dürfen ja zuvor nur Buchstaben und Zahlen sein.

          Acho, fürs Verständnis: Die Hashwerte sind mal durch eine Erweiterung zugekommen.
          Anstatt die Datensätze mit einem Flag ungültig zu machen, wurde die E-Mail verunglimpft. Nicht die cleverste Lösung, aber lässt sich jetzt nicht mehr ändern.
          PHP rocks!
          Eine Initiative der PHP Community

          Comment


          • #6
            Warum nicht mit SubString abschneiden?

            https://docs.microsoft.com/en-us/sql...ql-server-2017
            Christian

            Comment


            • #7
              Naja, wie denn? Ich könnte zwar substring vom Offset 33 machen, aber ich muß ja dafür die Bedingung festlegen, das trifft ja anicht auf alle E-Mails zu.
              Woher soll ich denn wissen, dass es einer dieser gehashten Datensätze ist?
              PHP rocks!
              Eine Initiative der PHP Community

              Comment


              • #8
                aber ich muß ja dafür die Bedingung festlegen, das trifft ja anicht auf alle E-Mails zu.
                Das war ja hier so nicht bekannt, diese Bedingung

                Man kann natürlich nach dem _ suchen


                SUBSTRING(eMail,CHARINDEX('_',eMail),LEN(eMail)-CHARINDEX('_',eMail))

                So in etwa...ggf. verschoben um 1 Zeichen

                Um auszuschließen, dass es bei eMails ohne Hash gemacht wird, ggf. ein case mit der Suche nach einem _ vorschalten
                Zuletzt editiert von Christian Marquardt; 05.09.2018, 18:44.
                Christian

                Comment


                • #9
                  Ja, schon richtig, aber es könnte ja auch E-Mails der Form vorname_nachname@example.com geben.
                  PHP rocks!
                  Eine Initiative der PHP Community

                  Comment


                  • #10
                    Um auszuschließen, dass es bei eMails ohne Hash gemacht wird, ggf. ein case mit der Suche nach einem _ vorschalten
                    ..und mindenstens 1 Ziffer vor dem _ und 32 Zeichen lang

                    Sofern diese Bedingungen auch dann zutreffen, weil es auch eMails
                    xx123xx_Mustermann@sdddd.de
                    gibt, kannst du das dann auch mit einem Script nicht mehr lösen
                    Christian

                    Comment


                    • #11
                      Ja, 100% wirst Du mit keiner Lösung haben, das ist ja auch gar nicht das Thema.
                      Ich denke aber, dass es die höchste Trefferquote hätte, wenn ich feststellen kann, ob die Mail mit 32 Zeichen ( rein aus Buchstaben und Ziffern bestehend ) und einem Underscore folgend beginnt.
                      Dann würde auch xx123xx_Mustermann@sdddd.de nicht gematched und die, die zufällig mit diesen 32 Zeichen und folgendem Underscore beginnen, aber keine Hashes sind, sind für mich Toleranz-Verlust. Damit kann ich leben.

                      Aber ich sehe schon, es scheint für den MSSQL-Server keine sinnvolle Variante zu geben.
                      Es soll wohl funktionieren, wenn man sich selber eine .NET-Function baut und diese in den MSSQL-Server deployed. Aber das schaue ich mir später mal an, wenn das Thema öfter vorkommt.

                      Wenn es soweit ist, würde ich das hier posten, falls Interesse besteht?

                      Gruß Arne
                      PHP rocks!
                      Eine Initiative der PHP Community

                      Comment


                      • #12
                        Klar kannst du das posten
                        Christian

                        Comment


                        • #13
                          Die vermutlich beste Lösung ist, auch wenn du sie blöd findest, einfach 32* nach [0-f] gefolgt von einem Underscore zu fragen in einem Like. Ein Hash sollte nur aus Hex Stellen bestehen.
                          Ja das SQL selbst sieht doof aus. Von der Performance her aber vermutlich jeder anderen irgendwie scheinbar eleganten Lösung vorzuziehen.
                          Die Lösung ist halt genauso blöd wie das verbastelte DB-Schema. Also angemessen.

                          Neben dem einbinden von NET kannst du auch einfach ein Script in R schreiben. Scripting muß man nur einschalten und ansonsten nicht groß konfigurieren.

                          Comment


                          • #14
                            Originally posted by Ralf Jansen View Post
                            Die Lösung ist halt genauso blöd wie das verbastelte DB-Schema. Also angemessen.


                            Originally posted by Ralf Jansen View Post
                            Neben dem einbinden von NET kannst du auch einfach ein Script in R schreiben. Scripting muß man nur einschalten und ansonsten nicht groß konfigurieren.
                            Das' noch ne Idee, da habe ich noch nicht dran gedacht.
                            PHP rocks!
                            Eine Initiative der PHP Community

                            Comment

                            Working...
                            X