0

我遇到了一些问题,我似乎无法使用正则表达式来匹配名称中的 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
4

3 回答 3

1

你正在寻找这个

(.*[ae]){3,}

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

所以你的查询变成:

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

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

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

于 2016-02-12T14:02:39.403 回答
0

如果您希望名称中至少包含 3ae',则:

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

如果你想要至少 3 个连续a的 's 或es 然后:

select manager_name
from   manages
where  regexp_like(employee_name, '.*[ae]{3,}', 'i' );
于 2016-02-12T14:24:05.297 回答
0

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

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

in 第三个参数的值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().

于 2016-02-12T22:10:59.210 回答