为什么REGEXP_SUBSTR读取某些字符(“ L”和“ RD”)的方式与其他字符不同

时间:2019-04-24 23:08:35

标签: regexp-substr

我正在使用REGEXP,某些字符会产生意外结果

我尝试了下面的代码

WITH DATA(str) AS(
   SELECT '437 E MERRIMACK ST APT 14' FROM dual UNION ALL
   SELECT '29 MARIAN RD # B' FROM dual UNION ALL
   SELECT '29 MARIAN RD' FROM dual UNION ALL
   SELECT '29 MARIAN ST' FROM dual UNION ALL
   SELECT '104 BEECH ST # 1L'    FROM dual UNION ALL
   SELECT 'w32 IRVING RD APT M'    FROM dual UNION ALL
   SELECT 'w32 IRVING RD # L'    FROM dual UNION ALL
   SELECT 'w32 IRVING AVE'    FROM dual UNION ALL
   SELECT '288 N MAIN ST APT 1-4'   FROM dual
)
SELECT 
str
,REGEXP_SUBSTR(str,  '[^(APT |FL |# |$)]+$') APT 
FROM data;

第1、2、4、6、9行是精细行3、5、7、8,它们不能正确捕获APT。 “ L”,“ RD”和“ AVE”似乎存在一些问题。我希望#3中的APT为空,#5中的APT为1L,#7中的L为L,#8为空。

result# STR                         APT
1   437 E MERRIMACK ST APT 14        14
2   29 MARIAN RD # B                  B
3   29 MARIAN RD                     RD
4   29 MARIAN ST                     null
5   104 BEECH ST # 1L                null
6   w32 IRVING RD APT M              M
7   w32 IRVING RD # L                null
8   w32 IRVING AVE                VE 
9   288 N MAIN ST APT 1-4            1-4

1 个答案:

答案 0 :(得分:0)

简而言之,不是,这是因为您的正则表达式是错误的。您正在使用描述字符类(单个字符)的方括号。在您的情况下,请不要使用开放的括号或A或P或T等。

尝试执行此操作,该操作将返回第二组,该组在最后一次出现的字符串之后,以空格结尾,然后是一组'APT'或井号,然后是另一个空格,然后是其他内容,直到该行的末尾(捕获“任何内容” “ 在一组)。换句话说,保存最后一个APT或#之后的所有内容,并考虑该APT:

WITH DATA(id, str) AS (
   SELECT 1, '437 E MERRIMACK ST APT 14' FROM dual UNION ALL
   SELECT 2, '29 MARIAN RD # B'          FROM dual UNION ALL
   SELECT 3, '29 MARIAN RD'              FROM dual UNION ALL
   SELECT 4, '29 MARIAN ST'              FROM dual UNION ALL
   SELECT 5, '104 BEECH ST # 1L'         FROM dual UNION ALL
   SELECT 6, 'w32 IRVING RD APT M'       FROM dual UNION ALL
   SELECT 7, 'w32 IRVING RD # L'         FROM dual UNION ALL
   SELECT 8, 'w32 IRVING AVE'            FROM dual UNION ALL
   SELECT 9, '288 N MAIN ST APT 1-4'     FROM dual
)
SELECT id, str,
       REGEXP_SUBSTR(str,  '^.* (APT|#) (.*)$', 1, 1, null, 2) APT 
FROM data;

        ID STR                       APT                      
---------- ------------------------- -------------------------
         1 437 E MERRIMACK ST APT 14 14                       
         2 29 MARIAN RD # B          B                        
         3 29 MARIAN RD                                       
         4 29 MARIAN ST                                       
         5 104 BEECH ST # 1L         1L                       
         6 w32 IRVING RD APT M       M                        
         7 w32 IRVING RD # L         L                        
         8 w32 IRVING AVE                                     
         9 288 N MAIN ST APT 1-4     1-4                      

9 rows selected.