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

Posted

技术标签:

【中文标题】如何使用正则表达式计算字符串中的单词【英文标题】:How do I Count the words in a string using regex 【发布时间】:2020-09-22 18:21:53 【问题描述】:

我正在尝试使用 Oracle 10g 中的正则表达式计算字符串中的单词。 我一直在尝试这个

select *
from books
where REGEXP_LIKE(title, '[ ]2'); 

使其返回的标题至少包含 3 个单词。

【问题讨论】:

10g 早已不复存在。而甲骨文早就停止支持它了。您是在做一些客户项目还是一些不严肃的项目?因为,您可以下载免费提供的 12.2c 并开始工作。 Oracle 12.2 即将结束首要支持。您可能应该计划升级到 19.8。 【参考方案1】:

INSTR 也是一个可行的选择。通过查找第二次出现的空格,这将表明该字符串至少包含 3 个单词。

WITH
    books
    AS
        (SELECT 'Tom Sawyer' title FROM DUAL
         UNION ALL
         SELECT 'A tale of two cities' FROM DUAL
         UNION ALL
         SELECT 'The Little Prince' FROM DUAL
         UNION ALL
         SELECT 'Don Quixote' FROM DUAL)
SELECT title
  FROM books
 WHERE instr(title, ' ', 1, 2) > 0;

如果您坚持使用正则表达式,则可以使用下面的正则表达式来查找包含 3 个或更多单词的书籍。

WITH
    books
    AS
        (SELECT 'Tom Sawyer' title FROM DUAL
         UNION ALL
         SELECT 'A tale of two cities' FROM DUAL
         UNION ALL
         SELECT 'The Little Prince' FROM DUAL
         UNION ALL
         SELECT 'Don Quixote' FROM DUAL)
SELECT title
  FROM books
 WHERE REGEXP_LIKE (title, '(\S+\s)2,');

(感谢@Littlefoot 的书!)

【讨论】:

嘿,你能澄清一下第一个区块中的 WHERE 吗?在哪里 instr(title, ' ', 1, 2) > 0;您表示您希望所有带有空格的标题都返回,但是 1, 2 是做什么的?你会如何口头表达这个函数参数?我只是在学习sql,我正在尝试尽可能地理解一切,感谢您的帮助 如果你查看 INSTR (docs.oracle.com/cd/B19306_01/server.102/b14200/functions068.htm) 的文档,1 代表字符串中的起始位置,2 代表出现。所以INSTR(title, ' ', 1, 2) 正在从字符串title 中的第一个字符开始寻找第二次出现的空格。【参考方案2】:

REPLACE 完成这项工作(通过一些计算)。

SQL> with books as
  2    (select 'Tom Sawyer' title      from dual union all
  3     select 'A tale of two cities'  from dual union all
  4     select 'The Little Prince'     from dual union all
  5     select 'Don Quixote'           from dual
  6    )
  7  select title
  8  from books
  9  where length(title) - length(replace(title, ' ', '')) >= 2;

TITLE
--------------------
A tale of two cities
The Little Prince

SQL>

【讨论】:

【参考方案3】:

下面这个简单易懂(适用于11g及更高版本):

以下只是创建一些示例数据

create table books as
with tab as
(
    select 'Tom Sawyer' title from dual
    union all
    select 'A tale of two cities' from dual
    union all
    select 'The Little Prince' from dual
    union all
    select 'The_Little_Prince' from dual
    union all
    select 'Don Quixote' from dual
    union all
    select null from dual
)
select  title
from    tab;

以下是获取至少包含 3 个单词的标题的解决方案

select  title 
from    books
where   regexp_count(title, '\w+') > 2

输出:

【讨论】:

很遗憾,10g 不理解 REGEXP_COUNT 所以这不起作用。 哦,听到这个消息很难过。事实上,当开始学习和编码时,10g 已经消失了。无论如何,我会编辑我的回复说它适用于 11g 及更高版本。这可能会帮助将来有类似情况的人。谢谢指正。

以上是关于如何使用正则表达式计算字符串中的单词的主要内容,如果未能解决你的问题,请参考以下文章

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

如何提取 MySQL 字符串中的第 n 个单词并计算单词出现次数?

用于匹配单词的 javascript 正则表达式模式,具有自定义单词边界

如何使用正则表达式,将字符串中的每个单词首字母大写

正则表达式

正则表达式