Как считать слова в MySQL / заменителе регулярных выражений? - PullRequest
16 голосов
/ 18 ноября 2009

Как я могу в запросе MySQL вести себя так же, как функция Regex.Replace (например, в .NET / C #)?

Мне это нужно, потому что, как и многим людям, я хотел бы посчитать количество слов в поле. Однако я не удовлетворен следующим ответом (приведенным несколько раз на этом сайте):

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

Потому что это не дает хороших результатов, когда между двумя словами больше одного пробела.

Кстати, я думаю, что функция Regex.Replace может быть интересной, поэтому приветствуются все хорошие идеи!

Ответы [ 4 ]

17 голосов
/ 18 ноября 2009

REGEXP_REPLACE доступен как Пользовательские функции MySQL .

Подсчет слов: если вы можете контролировать данные, поступающие в базу данных, вы можете удалить двойной пробел перед вставкой. Также, если вам часто приходится обращаться к количеству слов, вы можете вычислить его один раз в своем коде и сохранить его в базе данных.

1 голос
/ 05 августа 2016

ОБНОВЛЕНИЕ: теперь добавлено отдельный ответ для MySQL 8.0 + , который следует использовать в предпочтении. (Сохраняет этот ответ в случае ограничения использования более ранней версии.)

Почти дубликат этого вопроса , но этот ответ будет касаться варианта использования подсчета слов на основе расширенной версии пользовательского заменителя регулярного выражения из этого сообщения в блоге .

Демо

Демонстрационная версия Rextester

Для образца текста это счетчик 61 - так же, как и все счетчики онлайн-слов, которые я пробовал (например, https://wordcounter.net/).

SQL (исключая код функции для краткости) :

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;
0 голосов
/ 13 июля 2018

MySQL 8.0 теперь предоставляет приличную REGEXP_REPLACE функцию, которая делает это намного проще:

SQL

SELECT -- Count the number of gaps between words
       CHAR_LENGTH(txt) -
           CHAR_LENGTH(REGEXP_REPLACE(
               txt,
               '[[:space:]]([[:space:]]*)', -- A chunk of one or more whitespace characters
               '$1')) -- Discard the first whitespace character and retain the rest
           + 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;

Демо

Онлайн-демонстрация DB-Fiddle

0 голосов
/ 18 ноября 2009

Ответ: нет, вы не можете иметь такое же поведение в MySQL.

Но я рекомендую вам проверить этот ранее вопрос на тему, которая ссылается на UDF, который предположительно включает некоторые из этих функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...