我如何在MySQL查询中具有与Regex.Replace函数相同的行为(例如在.NET / C#中)?
我需要这个,因为和很多人一样,我想计算一个字段中的单词数量。但是,我对以下答案不满意(在该网站上多次给出):
SELECT LENGTH(name) - LENGTH(REPLACE(name, ' ', '') +1 FROM table
因为当两个单词之间有一个空格时,它不会给出好的结果。
顺便说一下,我认为Regex.Replace功能可能很有趣,所以欢迎所有好主意!
答案 0 :(得分:17)
REGEXP_REPLACE可用MySQL user-defined functions。
字数统计:如果您可以控制进入数据库的数据,则可以在插入之前删除双空格。此外,如果您必须经常访问单词计数,您可以在代码中计算一次并将计数存储在数据库中。
答案 1 :(得分:1)
更新:现在已添加a separate answer for MySQL 8.0+,应优先使用。 (如果受限于使用早期版本,请保留此答案。)
几乎是this question的副本,但这个答案将解决基于this blog post的自定义正则表达式替换器的高级版本计算单词的用例。
<强>演示强>
对于示例文本,这给出了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;
演示