2009-11-18 23 views
16

Wie kann ich in einer MySQL-Abfrage das gleiche Verhalten wie die Regex.Replace-Funktion (zum Beispiel in .NET/C#) haben?Wie Wörter in MySQL/regulären Ausdruck ersetzen zählen?

Ich brauche das, weil, wie viele Menschen möchte ich die Anzahl der Wörter in einem Feld zählen. Allerdings bin ich nicht zufrieden mit der folgenden Antwort (mehrmals auf dieser Website angegeben):

SELECT LENGTH(name) - LENGTH(REPLACE(name, ' ', '') +1 FROM table 

Weil es keine guten Ergebnisse nicht geben, wenn es mehr, dass ein Leerzeichen zwischen zwei Worten ist.

Übrigens, ich denke, die Regex.Replace-Funktion kann interessant sein, so dass alle guten Ideen willkommen sind!

+0

Aus Neugier, warum die Worte in einem Feld zu zählen? – Peter

Antwort

17

Es ist REGEXP_REPLACE als MySQL user-defined functions verfügbar.

Word-Zählung: Wenn Sie die Daten steuern können, die in die Datenbank gehen, können Sie doppelte Whitespaces vor dem Einfügen entfernen. Wenn Sie häufig auf die Wortzählung zugreifen müssen, können Sie sie einmal in Ihrem Code berechnen und die Anzahl in der Datenbank speichern.

+0

Entschuldigung, so spät zu akzeptieren ... – PierrOz

0

Die Antwort ist nein, Sie können nicht das gleiche Verhalten in MySQL haben.

Aber ich empfehle Ihnen, diese frühere question auf das Thema, das Links zu einer UDF, die angeblich einige dieser Funktionalität ermöglicht verlinkt.

1

Fast ein Duplikat von this question, aber diese Antwort wird den Anwendungsfall des Zählens von Wörtern basierend auf der erweiterten Version des benutzerdefinierten regulären Ausdrucksersetzers von this blog post adressieren.

Demo

Rextester online demo

Für den Beispieltext, ergibt dies eine Anzahl von 61 - das gleiche wie alle Online-Wortzähler Ich habe versucht (z https://wordcounter.net/).

SQL (ohne Funktionscode der Kürze halber):

SELECT txt, 
     -- Count the number of gaps between words 
     CHAR_LENGTH(txt) - 
     CHAR_LENGTH(reg_replace(txt, 
           '[[:space:]]+', -- Look for a chunk of whitespace 
           '^.', -- Replace the first character from the chunk 
           '', -- Replace with nothing (i.e. remove the character) 
           TRUE, -- Greedy matching 
           1, -- Minimum match length 
           0, -- No maximum match length 
           1, -- Minimum sub-match length 
           0 -- No maximum sub-match length 
           )) 
     + 1 -- The word count is 1 more than the number of gaps between words 
     - IF (txt REGEXP '^[[:space:]]', 1, 0) -- Exclude whitespace at the start from count 
     - IF (txt REGEXP '[[:space:]]$', 1, 0) -- Exclude whitespace at the end from count 
     AS `word count` 
FROM tbl; 
Verwandte Themen