Allgemeine Verwendung von Regexp in Mysql Fuzzy-Matching, das bestimmte Zeichenfolgen enthält # Suchen Sie nach Datensätzen, die „Car Club“ im Inhaltsfeld enthalten Wählen Sie * aus Clubinhalt, wobei der reguläre Inhaltsausdruck „Autoclub“ lautet.
# Die folgende Verwendung von regexp und like ist gleichwertig Wählen Sie * aus club_content, wo Inhalte wie „%车友俱乐部%“ aussehen.
Fuzzy-Matching, beginnend mit einer bestimmten Zeichenfolge # Suchen Sie im Inhaltsfeld nach den Datensätzen, die mit „车友“ beginnen Wählen Sie * aus Club_Content, wobei der reguläre Inhaltsausdruck „^车友“ lautet.
# Die folgende Verwendung von regexp und like ist gleichwertig Wählen Sie * aus club_content, wo Inhalte wie „车友%“ aussehen.
Fuzzy-Matching, das mit einer bestimmten Zeichenfolge endet # Suchen Sie nach Datensätzen, die im Inhaltsfeld mit „车友“ enden Wählen Sie * aus Clubinhalt, wobei der reguläre Inhaltsausdruck „车友$“ lautet.
# Die folgende Verwendung von regexp und like ist gleichwertig Wählen Sie * aus club_content, wo Inhalte wie „%车友“ aussehen.
Fuzzy-Matching oder Beziehung # Suche im Inhaltsfeld nach „Erfahrung“, „Teilen“ oder „technischer Beitrag“ select * from club_content where content REGEXP 'Erfahrung|Teilen|Technischer Beitrag'
Fuzzy-Matching, ohne Berücksichtigung einzelner Zeichen # Suchen Sie nach Datensätzen, die im Inhaltsfeld nicht das Wort "车" oder "友" enthalten wähle * aus club_content, wobei content REGEXP [^rider]
Ich war schockiert, als ich das Ergebnis sah. Alle Datensätze wurden angezeigt. Warum? Denn sobald die eckigen Klammern „[]“ hinzugefügt werden, wird der Inhalt darin in einzelne Zeichen aufgeteilt und dann abgeglichen. Dabei wird jedes Zeichen einzeln abgeglichen, um festzustellen, ob es „车“ oder „友“ entspricht. Das zurückgegebene Ergebnis ist eine Reihe logischer Werte 0 und 1. Wenn Sie eine Übereinstimmung mit einer Zeichenfolge erzielen möchten, die eine bestimmte Zeichenfolge nicht enthält, wie können Sie dies erreichen? Fuzzy-Matching, das keine bestimmte Zeichenfolge enthält # Datensätze finden, deren Inhaltsfeld nicht die Zeichenfolge „车友“ enthält Wählen Sie * aus Clubinhalt, wobei der Inhalt nicht REGEXP „Fahrer“ ist.
MySql REGEXP-Operator zum Abgleichen von Zeichenfolgen 1 ^ entspricht der Zeichenfolge, die mit dem diesem Zeichen folgenden Zeichen beginnt. Beispiel: REGEXP '^x' bedeutet, dass das Zeichen übereinstimmt, das mit x beginnt. 2 $ entspricht der Zeichenfolge, die mit dem Zeichen davor endet. Beispiel: REGEXP 'y$' bedeutet, dass das Zeichen übereinstimmt, das mit y endet 3. Passen Sie jedes Zeichen an 4 [...] Stimmt mit jedem beliebigen Zeichen in den eckigen Klammern überein. Zum Beispiel: [1-9] entspricht den Zahlen von 1 bis 9, [abc] entspricht einer beliebigen davon 5 * entspricht null oder mehr vorangehenden Zeichen, z. B.: x* entspricht einer beliebigen Anzahl von x Zeichen
So ermitteln Sie, ob eine Zeichenfolge in MySQL eine Zahl ist Diese Frage ist etwas seltsam, aber wir speichern Zahlen oft in Form von Zeichenfolgen, und wenn wir Zeichenfolgen für mathematische Operationen verwenden, scheint nichts schief zu gehen. Es sei denn, die für mathematische Operationen verwendete Zeichenfolge kann nicht in eine Zahl umgewandelt werden. Aber wie bestimmen wir, ob eine Zeichenfolge in eine Zahl umgewandelt werden kann? Verwenden Sie den REGEXP-Operator von MySQL. Wie wird er verwendet? {String} REGEXP '[^0-9.]'
Wir müssen den String davor beurteilen und der String dahinter ist der reguläre MySQL-Ausdruck, d. h. übereinstimmende Zeichen, bei denen es sich nicht um Zahlen oder Dezimalstellen handelt. Wenn die Zeichenfolge eine andere Zahl als 0-9 oder einen Dezimalpunkt enthält, wird „true“ zurückgegeben, andernfalls „false“. Zum Beispiel: select ('123a' REGEXP '[^0-9.]'); --'123a' enthält das Zeichen 'a'. Die Ausgabe ist 1. Die Konstante true wird in MySQL als 1 und false als 0 ausgegeben.
Hinweis: Wenn die Zeichenfolge Leerzeichen enthält, stimmt der reguläre Ausdruck auch überein und gibt 1 zurück. Wenn Sie die Leerzeichen an beiden Enden entfernen möchten, müssen Sie die Funktion trim() auf die Zeichenfolge anwenden. Dies ist nur eine einfache Anwendung des REGEXP-Operators. Eine detaillierte Anwendung von REGEXP finden Sie in der offiziellen Dokumentation.
MySQL-reguläre Ausdrücke In den vorherigen Kapiteln haben wir gelernt, dass MySQL durch LIKE ...% Fuzzy-Matching durchführen kann. MySQL unterstützt auch das Abgleichen anderer regulärer Ausdrücke. Der Operator REGEXP wird in MySQL zum Abgleichen regulärer Ausdrücke verwendet. Wenn Sie PHP oder Perl kennen, ist dies ziemlich unkompliziert, da die reguläre Ausdrucksübereinstimmung von MySQL diesen Skripten ähnelt. Die regulären Ausdrucksmuster in der folgenden Tabelle können mit dem REGEXP-Operator verwendet werden. Modell | beschreiben |
---|
^ | Stimmt mit dem Anfang der Eingabezeichenfolge überein. Wenn die Eigenschaft „Multiline“ des RegExp-Objekts festgelegt ist, entspricht ^ auch der Position nach „\n“ oder „\r“. | $ | Stimmt mit dem Ende der Eingabezeichenfolge überein. Wenn die Eigenschaft „Multiline“ des RegExp-Objekts gesetzt ist, entspricht „$“ auch der Position vor „\n“ oder „\r“. | . | Stimmt mit jedem einzelnen Zeichen außer "\n" überein. Um jedes Zeichen einschließlich „\n“ abzugleichen, verwenden Sie ein Muster wie „[.\n]“. | [...] | Eine Sammlung von Charakteren. Stimmt mit einem beliebigen der enthaltenen Zeichen überein. Beispielsweise kann „[abc]“ mit „a“ in „plain“ übereinstimmen. | [^...] | Eine Reihe negativer Zeichen. Stimmt mit jedem Zeichen überein, das nicht in der Zeichenfolge enthalten ist. Beispielsweise kann „[^abc]“ mit dem „p“ in „plain“ übereinstimmen. | p1|p2|p3 | Stimmt mit p1 oder p2 oder p3 überein. Beispielsweise entspricht „z|food“ „z“ oder „food“. „(z|f)ood“ passt zu „zood“ oder „food“. | * | Stimmt null oder mehrmals mit dem vorhergehenden Unterausdruck überein. Beispielsweise entspricht zo* den Begriffen „z“ und „zoo“. * Entspricht {0,}. | + | Stimmt ein- oder mehrmals mit dem vorhergehenden Unterausdruck überein. Beispielsweise entspricht „zo+“ den Begriffen „zo“ und „zoo“, aber nicht „z“. + ist gleichbedeutend mit {1,}. | {N} | n ist eine nicht negative Ganzzahl. Stimmt mit einer bestimmten Anzahl von Malen überein. Beispielsweise entspricht 'o{2}' nicht dem 'o' in „Bob“, wohl aber den beiden o's in „food“. | {n,m} | Sowohl m als auch n sind nicht-negative ganze Zahlen, wobei n <= m. Stimmt mindestens n-mal und höchstens m-mal überein. |
Beispiele Nachdem wir die oben genannten regulären Anforderungen verstanden haben, können wir SQL-Anweisungen mit regulären Ausdrücken entsprechend unseren Anforderungen schreiben. Nachfolgend listen wir einige kleine Beispiele auf (Tabellenname: person_tbl), um unser Verständnis zu vertiefen: Suche nach allen Daten, die im Namensfeld mit „st“ beginnen: mysql> SELECT Name FROM Person_Tabelle WHERE Name REGEXP '^st';
Suche alle Daten, die im Namensfeld mit „ok“ enden: mysql> SELECT Name FROM person_tbl WHERE Name REGEXP 'ok$';
Suche nach allen Daten, die die Zeichenfolge „mar“ im Namensfeld enthalten: mysql> SELECT Name FROM Person_Tabelle WHERE Name REGEXP 'mar';
Suche alle Daten im Namensfeld, die mit einem Vokal beginnen oder mit der Zeichenfolge „ok“ enden: mysql> SELECT Name FROM person_tbl WHERE Name REGEXP '^[aeiou]|ok$';
Praxishinweise zum Lernen regulärer MySQL-REGEXP REGEXP ist eine Funktion, die zum Ausführen regulärer Ausdrücke in MySQL verwendet wird, wie preg in PHP. Wenn die reguläre Funktion regexp nur eine einfache Abfrage ist, können Sie like verwenden, aber wenn sie komplex ist, müssen Sie trotzdem regexp verwenden. Werfen wir einen Blick darauf. Das MySQL-Benutzerhandbuch empfiehlt, beim Erstellen einfacher Abfragen weiterhin Platzhalter zu verwenden. wie: Wählen Sie [*|Feldnamenliste] aus [Tabellenname], wobei [Feldname] wie ["%someletter"|"%someletter%","_","?someletter"];
Bei einigen speziellen Abfragen sind reguläre Ausdrücke jedoch nicht zulässig. MySQL bietet drei WHERE-Prädikate für reguläre Ausdrücke, nämlich: REGEXP, RLIKE, NICHT RLIKE
Verwenden Sie diese drei, um das ursprüngliche LIKE-Prädikat zu ersetzen, auf das ein regulärer Ausdruck folgen kann. Um beispielsweise Daten abzufragen, die "_" in einem Feld enthalten, verwenden Sie die folgende Abfrageanweisung: Wählen Sie * aus Tabellenname, wobei Feldname RLIKE '.[_].' ist;
Einige Zeichen für erweiterte reguläre Ausdrücke sind: · „.“ steht für jedes einzelne Zeichen. · Die Zeichenklasse "[...]" passt zu jedem Zeichen innerhalb der eckigen Klammern. Beispielsweise entspricht „[abc]“ „a“, „b“ oder „c“. Um einen Zeichenbereich zu benennen, verwenden Sie ein "-". „[az]“ entspricht jedem Buchstaben und „[0-9]“ entspricht jeder Ziffer. · „*“ entspricht keinem oder mehreren der vorangehenden Zeichen. Beispielsweise entspricht „x*“ einer beliebigen Anzahl von „x“-Zeichen, „[0-9]*“ entspricht einer beliebigen Anzahl von Ziffern und „.*“ entspricht einer beliebigen Anzahl von beliebigen Zeichen. Wenn das REGEXP-Muster irgendwo im getesteten Wert übereinstimmt, stimmt das Muster überein (dies unterscheidet sich vom LIKE-Mustervergleich, der nur übereinstimmt, wenn er mit dem gesamten Wert übereinstimmt). Um ein Muster so zu positionieren, dass es mit dem Anfang oder Ende des getesteten Werts übereinstimmen muss, verwenden Sie „^“ am Anfang des Musters oder „$“ am Ende des Musters. Um Namen zu finden, die mit „b“ beginnen, verwenden Sie „^“, um den Anfang des Namens abzugleichen: Verwenden regulärer Ausdrücke SELECT * FROM Haustier WHERE Name REGEXP BINARY '^b'; Wählen Sie * aus Haustier, wobei Name REGEXP 'fy$' ist; SELECT * FROM Haustier WHERE Name REGEXP 'w'; Wählen Sie * aus Haustier, wobei Name REGEXP '^…..$' ist; Wählen Sie * aus Haustier, wobei Name REGEXP '^.{5}$' ist;
Ich bin heute auf ein solches Problem in der Anwendung gestoßen. Es gibt ein Feld t1 mit Werten wie: 1,1,1,2,3,3,4,4,5,5,2,4,3,2,1,2 Sie müssen beispielsweise danach suchen: Die Zahl vor dem ersten Komma liegt zwischen 3 und 5, die Zahl vor dem dritten Komma liegt zwischen 3 und 5, die Zahl vor dem zehnten Komma liegt zwischen 3 und 5 und der Rest liegt zwischen 1 und 5. . . Die SQL-Anweisung kann wie folgt geschrieben werden: AUSWÄHLEN * VON tb, WO t1 REGEXP '^[3-5],[1-5],[3-5],[1-5],[1-5],[1-5],[1-5],[1-5],[1-5],[1-5],[3-5],[1-5],[1-5],[1-5],[1-5],[1-5],[1-5]%';
1. Verwenden Sie die Vergleichsoperatoren LIKE und NOT LIKE (beachten Sie, dass Sie nicht = oder != verwenden können); 2. Der Modus ist standardmäßig nicht case-sensitiv; 3. Erlauben Sie, dass „_“ jedem einzelnen Zeichen entspricht und „%“ einer beliebigen Anzahl von Zeichen (einschließlich Nullen). Fügen Sie einige reguläre MySQL-Regeln an ^ entspricht dem Anfang einer Zeichenfolge $ entspricht dem Ende einer Zeichenfolge . entspricht jedem Zeichen (einschließlich Wagenrücklauf und Zeilenumbruch) a* entspricht jeder Folge von 0 oder mehr a-Zeichen a+ entspricht einer beliebigen Folge von 1 oder mehr a-Zeichen a? entspricht 0 oder 1 a-Zeichen de|abc entspricht der Zeichenfolge de oder abc (abc)* entspricht 0 oder mehr Instanzen der Sequenz adc
{n}, {m,n} Die Notation {n} oder {m,n} bietet eine allgemeinere Möglichkeit, reguläre Ausdrücke zu schreiben, mit der viele vorhergehende Atome (oder „Teile“) des Musters abgeglichen werden können. Sowohl m als auch n sind ganze Zahlen. a* kann als {0,} geschrieben werden. a+ kann als {1,} geschrieben werden. a? kann als {0,1} geschrieben werden
[a-dX] entspricht jedem Zeichen, das a, b, c, d oder X ist. Das Zeichen '-' zwischen zwei anderen Zeichen bildet einen Bereich. [^a-dX] passt zu jedem Zeichen, das nicht a, b, c, d oder X ist. Das vorangestellte Zeichen '^' bedeutet Negation.
[.Zeichen.] Stimmt in Klammerausdrücken (mit [ und ]) mit einer Zeichenfolge überein, die zum Sortieren von Elementen verwendet wird, wobei es sich bei Zeichen um einzelne Zeichen oder Zeichennamen wie z. B. eine neue Zeile handelt. mysql> AUSWÄHLEN '~' REGEXP '[[.~.]]'; -> 1 mysql> SELECT '~' REGEXP '[[.tilde.]]'; -> 1
[=Zeichenklasse=] Innerhalb eines Klammerausdrucks (mit [ und ]) stellt [=character_class=] eine Gleichheitsklasse dar. Es gleicht alle Zeichen mit demselben Sortierungswert ab, einschließlich sich selbst. [[=a=]] ist gleichbedeutend mit [a(+)], [a+], [a{1,}]
[:Zeichenklasse:] Innerhalb eines Klammerausdrucks (mit [ und ]) stellt [:character_class:] eine Zeichenklasse dar, die mit allen Zeichen des Begriffs Klasse übereinstimmt. Die Standardklassennamen sind: alnum Alphanumerisches Zeichen Alpha-Textzeichen leer cntrl-Steuerzeichen Ziffer numerisches Zeichen Grafik-Charakter Kleinbuchstaben Grafiken oder Leerzeichen drucken punct Satzzeichen Leerzeichen Leerzeichen, Tabulator, neue Zeile und Wagenrücklauf Großbuchstaben im Text xdigit Hexadezimale Ziffer
[[:<:]], [[:>:]] Diese Markierungen zeigen Wortgrenzen an. Sie entsprechen jeweils dem Anfang und Ende eines Wortes. Ein Wort ist eine Folge von Wortzeichen, der weder Wortzeichen vorangehen noch folgen. Zeichen ist ein alphanumerisches Zeichen in der Klasse alnum oder ein Unterstrich (_). mysql> wähle 'fang shan zi' regulärer Ausdruck '[[:<:]]shan[[:>:]]'; -> 1 mysql> wähle 'fang shan zi' regulärer Ausdruck '[[:<:]]fang[[:>:]]'; -> 1 mysql> wähle 'fang shans zi' regulärer Ausdruck '[[:<:]]shan[[:>:]]'; -> 0
Reguläre Ausdrücke verwenden Sonderzeichen, denen zwei Backslash-Zeichen vorangestellt werden sollten. mysql> SELECT '1+2' REGEXP '1+2'; -> 0 mysql> SELECT '1+2' REGEXP '1+2'; -> 0 mysql> SELECT '1+2' REGEXP '1\+2'; -> 1
MySQL-Suchbedingungen mit regulärem regulären Ausdruck Ich benutze Mybatis t.hobby: bedingtes Feld Hobby: Suchparameter, der Wert kann aus mehreren durch Kommas getrennten Werten bestehen: „Lesen, Freunde finden, losgehen“ <!-- Der Wert von t.hobby kann sein: 'Essen, Trinken, Huren, Glücksspiel, Rauchen, Betrügen, Täuschen, Entführen, Täuschen, Stehlen'. Auf beiden Seiten jedes Wortes befinden sich unregelmäßige Leerzeichen --> <!-- Schritt-für-Schritt-Demonstration unten--> <if test="hobby!=null und hobby!=''"> concat(',',ERSETZEN (t.hobby, ' ', ''),',') regulärer Ausdruck concat(',(',ersetzen(#{hobby},',','|'),'),') </if> <!-- Extrahiere den Wert des Tabellenfelds t.hobby --> <if test="hobby!=null und hobby!=''"> concat(',',REPLACE (' essen, trinken, huren, spielen, rauchen, betrügen, täuschen, entführen, stehlen', ' ', ''),',') regexp concat(',(',replace(#{hobby},',','|'),'),') </if> <!-- Nach der Verarbeitung der Tabellenfeldwerte werden zusätzliche Leerzeichen entfernt--> <if test="hobby!=null und hobby!=''"> concat(',','essen,trinken,hure,zocken,rauchen,betrügen,betrügen,entführen,betrügen,stehlen',',') regexp concat(',(',replace(#{hobby},',','|'),'),') </if> <!-- Nach concat erhalten wir eine Zeichenfolge mit Kommas am Anfang und Ende --> <if test="hobby!=null und hobby!=''"> ',Essen, Trinken, Huren, Glücksspiel, Rauchen, Betrügen, Betrügen, Entführen, Betrügen, Stehlen,' regexp concat(',(',replace(#{hobby},',','|'),'),') </if> <!-- Den Wert des Parameters #{hobby} abrufen --> <if test="hobby!=null und hobby!=''"> ,Essen, Trinken, Hurerei, Glücksspiel, Rauchen, Betrügen, Täuschen, Entführung, Betrug, Stehlen,‘ regexp concat(‘,(‘,replace(‘Essen, Trinken, Hurerei, Hurerei‘,‘,‘,‘|‘),‘),‘) </if> <!-- Ersetzen Sie das Komma durch | --> <if test="hobby!=null und hobby!=''"> ',essen,trinken,Hure,spielen,rauchen,betrügen,betrügen,entführen,betrügen,stehlen,' regexp concat(',(','essen|trinken|Hure|Hure','),') </if> <!-- Nach concat erhalten wir eine Zeichenfolge mit Klammern und Kommas am Anfang und Ende --> <if test="hobby!=null und hobby!=''"> ,essen,trinken,Hure,spielen,rauchen,betrügen,betrügen,betrügen,stehlen,‘ regexp ,(essen|trinken|Hure|Hure),‘ <!-- In Erinnerung an Herrn Yu Qians Tugend, nicht zu spielen--> </if>
Das Ergebnis ist 1, also ist die Bedingung erfüllt. Zur Behandlung von Suchbedingungen werden vor allem komplexe Verfahren eingesetzt. Es ist ok, den Normalzustand herzustellen, der die Anforderungen erfüllt, aber ich persönlich denke, dass folgender Weg idealer ist: Die durchsuchten Felder wurden bei der ersten Speicherung der Daten formatiert: „essen, trinken, Hure, zocken, rauchen, betrügen, täuschen, entführen, betrügen, stehlen“ Die Suchbedingungen können verarbeitet und übergeben werden: ',(Essen|Trinken|Huren|Huren),' Dann kann die Suche vereinfacht werden zu <if test="hobby!=null und hobby!=''"> concat(',', t.hobby ,',') regulärer Ausdruck #{hobby} </if>
Das ist so ziemlich alles. Im Grunde kann man es verstehen. Wenn Sie es immer noch nicht verstehen, lesen Sie bitte die verwandten Artikel weiter unten. Das könnte Sie auch interessieren:- Regulärer Ausdruck (RegExp) bestimmt, ob das Textfeld Sonderzeichen enthält
- Analyse der Verwendung von „replace“ und „regexp“ zum Ersetzen regulärer Ausdrücke in MySQL
- Vollständige Anleitung zur Verwendung von REGEXP-regulären Ausdrücken in MySQL
- Detaillierte Erklärung zur Verwendung des regulären Ausdrucks regexp_like in Oracle
- js regulärer Ausdruck Erklärung Index-Attribut (RegExp Objekt)
- js regulärer Ausdruck RegExp Objektattribute lastIndex, lastMatch, lastParen, lastContext, rightContext Attributerklärung
- Detaillierte Erklärung des regulären Ausdrucks RegExp, einer neuen Funktion von ES9
|