【问题标题】:SQL using regular expression REGEXP_LIKE()SQL 使用正则表达式 REGEXP_LIKE()
【发布时间】:2016-02-12 13:59:29
【问题描述】:

我遇到了一些问题,我似乎无法用正则表达式来匹配名称中的 3 个或多个 a 或 e。

查找管理员工姓名中至少包含 3 个字母“a”或“e”(均为大写字母)的所有经理 和小写)。例如,名称中有 2 个“a”和 1 个“e”,将满足选择标准

select manager_name
  from manages
 where regexp_like(employee_name, '[a,e]{3, }');

当我这样做时,它会显示一个包含“e”或“a”的正确列表,但是当我尝试执行 3 个或更多时,它会返回空白集。下面还提供了示例数据。

select manager_name
  from manages
 where regexp_like(employee_name, '[a,e]');

样本数据

William Gates III
Lakshmi Mittal
Ingvar Kamprad
Lawrence Ellison
Mark Zuckerberg
Sheryl Sandberg
Liliane Bettencourt
Michael Dell

【问题讨论】:

  • 您能否分享一些示例输入并解释返回的输出是如何错误的。另外,您使用的是哪个rdbms
  • [aAeE]{3,} 是好的正则表达式
  • Oracle,它不应该返回一个空白集。
  • 我也不知道为什么我被否决了。

标签: sql oracle regexp-like


【解决方案1】:

你正在寻找这个而不是

(.*[ae]){3,}

.* 接受想要的字符之间的不同字符

所以你的查询变成:

select manager_name
  from manages
  where 
  regexp_like(employee_name, '(.*[ae]){3,}', 'i');

i 标志用于不敏感匹配,因此将大写 AE 考虑在内...如果省略,则执行敏感匹配...

您也可以简单地使用{3} 而不是{3,},在这种情况下会产生相同的结果

【讨论】:

  • .* 有什么作用?任何一个字符一次或多次?
  • 查询末尾的 'i' 做了什么?
  • 'i' 是匹配参数,告诉 Oracle 进行不区分大小写的搜索。 .* 是任意字符 (.) 零次或多次 (*)。
【解决方案2】:

如果您希望名称中的任意位置至少包含 3 个 ae,则:

select manager_name
from   manages
where  regexp_like(employee_name, '(.*?[ae]){3,}', 'i' );

如果您想要至少 3 个连续的 aes 那么:

select manager_name
from   manages
where  regexp_like(employee_name, '.*[ae]{3,}', 'i' );

【讨论】:

    【解决方案3】:

    您可以尝试使用REGEXP_COUNT() 而不是REGEXP_LIKE()

    SELECT manager_name
      FROM manages
     WHERE REGEXP_COUNT(employee_name, '[ae]', 1, 'i') >= 3;
    

    REGEXP_COUNT() 中第三个参数的值表示搜索应该从哪里开始(在这种情况下,我们希望从开头开始),而match_parameter 'i' 表示搜索应该不区分大小写。

    REGEXP_COUNT() 是在 Oracle 11g 中添加的;如果您使用的是早期版本的 Oracle,那么您可以尝试以下方法:

    SELECT manager_name
      FROM manages
     WHERE REGEXP_INSTR(employee_name, '[ae]', 1, 3, 0, 'i') > 0;
    

    上面的第四个参数(3)是正则表达式出现的次数。

    或:

    SELECT manager_name
      FROM manages
     WHERE REGEXP_SUBSTR(employee_name, '[ae]', 1, 3, 'i') IS NOT NULL;
    

    无论哪种方式,它都会使正则表达式比使用REGEXP_LIKE() 更简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      • 2020-06-12
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多