如何计算MySQL /正则表达式替换器中的单词?

时间:2009-11-18 11:33:35

标签: mysql regex replace word-count

我如何在MySQL查询中具有与Regex.Replace函数相同的行为(例如在.NET / C#中)?

我需要这个,因为和很多人一样,我想计算一个字段中的单词数量。但是,我对以下答案不满意(在该网站上多次给出):

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

因为当两个单词之间有一个空格时,它不会给出好的结果。

顺便说一下,我认为Regex.Replace功能可能很有趣,所以欢迎所有好主意!

4 个答案:

答案 0 :(得分:17)

REGEXP_REPLACE可用MySQL user-defined functions

字数统计:如果您可以控制进入数据库的数据,则可以在插入之前删除双空格。此外,如果您必须经常访问单词计数,您可以在代码中计算一次并将计数存储在数据库中。

答案 1 :(得分:1)

更新:现在已添加a separate answer for MySQL 8.0+,应优先使用。 (如果受限于使用早期版本,请保留此答案。)

几乎是this question的副本,但这个答案将解决基于this blog post的自定义正则表达式替换器的高级版本计算单词的用例。

<强>演示

Rextester online demo

对于示例文本,这给出了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;

答案 2 :(得分:0)

答案是不,你不能在MySQL中有相同的行为。

但我建议您先检查一下这个主题,然后查看链接到UDF的主题,该UDF可以启用某些功能。

答案 3 :(得分:0)

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 online demo