REGEXP在Oracle数据库中受挫

时间:2014-12-18 21:18:51

标签: regex database oracle

我在Oracle select语句中搜索并搜索了几种使用REGEXP_LIKE()评估这些名称模式的方法。如果我的表达式的计算结果为true,那么我只是根据它遇到的条件将原始列值放入各种设计列中。所以,我只是试图获得第一个,它不起作用!

我在数据库中有一列名称,这些名称是自由格式输入到一个字段中的。他们可以是:

FirstName LastName
FirstName MiddleInitial LastName
FirstName MiddleInitial. LastName
LastName, FirstName MiddleInitial.

其中涵盖了大部分案例。但我只想尝试评估第一个模式,如果它匹配FirstName LastName。

所以,我试过了:

(CASE Expressions)
  • REGEXP_LIKE(name, '\S+\s?\S+')并且对所有人都是正确的,即使名称中有2个空格的人也是如此,例如FirstName MiddleInitial LastName。
  • REGEXP_LIKE(name, '[^\s]+\s?[^\s]+')并且对所有人都是真的,我认为[^ \ s]会排除在名字和姓氏之间的任何地方被允许的空格。
  • REGEXP_LIKE(name, '[A-Z,a-z]+" "?[A-Z,a-z]')并且对所有人都是假的(尝试使用Posix版本而不是Perl受影响)。

我可能已经尝试了大约10种其他变体但我记不起来或者输入它们了。我希望有人可以让我开始使用FirstName LastName的第一个匹配案例然后我会“得到它”并从那里开始!

1 个答案:

答案 0 :(得分:4)

FirstName LastName将匹配^[^[:blank:]]+[[:blank:]]+[^[:blank:]]+$

  • ^从字符串
  • 开始
  • [^[:blank:]]+一个或多个非空白
  • [[:blank:]]+后跟一个或多个空白
  • [^[:blank:]]+后跟一个或多个非空白
  • $直到字符串
  • 的结尾

从Oracle 11g开始,您可以使用Perl-influenced Extensions in Oracle Regular Expressions 。因此,您可以使用更简洁的模式^\S+\s+\S+$

来实现完全相同的功能

话虽如此,您可能需要使用之类的标准化您的数据:

with testdata as (select 'James T. Kirk' ff from dual union all
                  select 'Montgomery Scott' from dual union all
                  select 'Riker, William T.' from dual union all
                  select 'Miles O''Brien' from dual union all
                  select 'Harcourt F Mudd' from dual),
     patterns as (select '^((\S+)\s+(\S+))$' s, '\2' fn, '' mi, '\3' ln from dual union all
                  select '^((\S+)\s+(\S)\s+(\S+))$', '\2' fn, '\3' mi, '\4' ln from dual union all
                  select '^((\S+)\s+(\S)\.\s+(\S+))$', '\2' fn, '\3' mi, '\4' ln from dual union all
                  select '^((\S+),\s+(\S+)\s+(\S)\.)$', '\3' fn, '\4' mi, '\2' ln from dual)

select regexp_replace(ff, s, fn) "first name",
       regexp_replace(ff, s, mi)  "middle initial",
       regexp_replace(ff, s, ln)  "last name"
from testdata cross join patterns
where regexp_like(ff, s)

请根据您的实际数据调整图案。有关实例,请参阅http://sqlfiddle.com/#!4/d41d8/39008