为什么 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.
我正在使用 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.