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

Posted

技术标签:

【中文标题】如何计算 MySQL / 正则表达式替换器中的单词?【英文标题】:How to count words in MySQL / regular expression replacer? 【发布时间】:2010-12-17 20:16:29 【问题描述】:

我怎样才能在 mysql 查询中具有与 Regex.Replace 函数相同的行为(例如在 .NET/C# 中)?

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

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

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

顺便说一句,我认为 Regex.Replace 函数可能很有趣,所以欢迎所有好的想法!

【问题讨论】:

出于好奇,为什么要数字段中的单词? 【参考方案1】:

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

【讨论】:

【参考方案2】:

更新:现在添加了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;

【讨论】:

【参考方案3】:

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

但我建议您早点查看question 的主题,该主题链接到据称启用某些此功能的 UDF。

【讨论】:

【参考方案4】:

有 REGEXP_REPLACE 可用 MySQL user-defined functions。

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

【讨论】:

以上是关于如何计算 MySQL / 正则表达式替换器中的单词?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式仅用替换文件中的单词替换单词

如何将此正则表达式替换从替换单个单词更改为替换单词数组?

如何匹配以下字符串,但不包括JS中的单词字符与正则表达式?

如何使用正则表达式计算字符串中的单词

使用正则表达式匹配MYSQL中句子中的单词

在 Python 中使用正则表达式查找和替换文件中的单词列表