我正在使用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
答案 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.