为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

蓝山帝景 2019-10-22 21:33:59

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


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


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

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


顺便说一句,我认为Regex.Replace函数可能很有趣,因此欢迎所有好的建议!


查看完整描述

3 回答

?
慕工程0101907

有REGEXP_REPLACE作为MySQL用户定义函数提供。


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


查看完整回答
反对 回复 2019-10-22
?
30秒到达战场

现在为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;


查看完整回答
反对 回复 2019-10-22
?
倚天杖

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;


查看完整回答
反对 回复 2019-10-22

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信