Подтвердить что ты не робот

Как подсчитать слова в MySQL/регулярном выражении replacer?

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Демо-версия SQL Fiddle

Для образца текста это дает число 106 - то же самое, что и все онлайн-счетчики слов, которые я пробовал (например, 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 test;

Ответ 3

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

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