REGEXP-匹配零个或多个先前子表达式的发生

时间:2018-06-20 17:20:59

标签: sql regex

我对以下查询中的结果为何如此显示感到困惑。以下是employees表中的姓氏列表:

Abel
Davies
De Haan
Ernst
Fay
Geraldo
Gietz
Grant
Hartstein
Higgins
Hunold
King
Kochhar
Lorentz
Matos
Mourgos
Rajs
Taylor
Vargas
Whalen
Zlotkey

以下查询返回员工的姓氏以及REGEXP_SUBSTR操作,以查找姓氏后带有一个或多个a的姓氏:

SQL> select last_name, regexp_substr(last_name,'a+',1,1,'i')
  2  from employees;

LAST_NAME                 REGEXP_SUBSTR(LAST_NAME,'
------------------------- -------------------------
Abel                      A
Davies                    a
De Haan                   aa
Ernst
Fay                       a
Geraldo                   a
Gietz
Grant                     a
Hartstein                 a
Higgins
Hunold
King
Kochhar                   a
Lorentz
Matos                     a
Mourgos
Rajs                      a
Taylor                    a
Vargas                    a
Whalen                    a
Zlotkey

为什么只有一个“ a”而不是另一个“ a”时,上述查询为什么返回子字符串的值?

此外,以下查询是相同的,但查找姓氏中出现零个或多个'a':

SQL> select last_name, regexp_substr(last_name,'a*',1,1,'i')
  2  from employees;

LAST_NAME                 REGEXP_SUBSTR(LAST_NAME,'
------------------------- -------------------------
Abel                      A
Davies
De Haan
Ernst
Fay
Geraldo
Gietz
Grant
Hartstein
Higgins
Hunold
King
Kochhar
Lorentz
Matos
Mourgos
Rajs
Taylor
Vargas
Whalen
Zlotkey

为什么上面的查询仅返回Abel的子字符串?它不应该显示其中包含“ a”的姓氏的子字符串吗?

请帮助我理解为什么这些查询的行为方式与它们相同。

编辑:我正在使用Oracle Database 12c

1 个答案:

答案 0 :(得分:1)

两个问题合在一起。...

  1. 第一个模式,您使用加号。正则表达式中的加号表示一个或多个。如果要匹配2个或更多,请使用{2,}或aa +。
  2. 在第二个中,您匹配0次或多次。可以想象这应该与任何字符串匹配,因为它们都包含0个或多个a。