为什么 REGEXP_SUBSTR 读取某些字符('L' 和 'RD')与其他字符不同

Why does REGEXP_SUBSTR read certain characters ('L' and 'RD') differently than other characters

我正在使用 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,#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

总之,不是,是你的regex不对。您正在使用描述字符 class (单个字符)的方括号。在你的情况下,不是开括号或 A 或 P 或 T 等

试试这个,其中 returns 第二组在最后一次出现以 space 结尾的字符串之后,然后是一组 'APT' 或井号,然后是另一个 space 然后直到行尾的任何内容(捕获组中的 "anything" )。换句话说,保存最后一个 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.