Почему REGEXP_SUBSTR читает определенные символы ('L' и 'RD') иначе, чем другие символы - PullRequest
0 голосов
/ 25 апреля 2019

Я работаю с 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».Я ожидаю, что APT в # 3 будет нулевым, APT в # 5 будет 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

1 Ответ

0 голосов
/ 01 мая 2019

Короче говоря, это не так, это то, что ваше регулярное выражение неверно. Вы используете квадратные скобки, которые описывают класс символов (один символ). В вашем случае, НЕ открытый парен или A или P или T и т. Д.

Попробуйте, это возвращает 2-ю группу, которая следует за последним вхождением строки, заканчивающейся пробелом, затем группой либо «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.
...