Oracle 拆分消息 regexp_substr
Oracle split message with regexp_substr
我需要拆分消息:
500 Oracle Parkway.Redwood Shores.*.=13
现在我对 Substr1/2/4
有了一些可行的解决方案
SELECT '500 Oracle Parkway.Redwood Shores.*.=13' string1,
REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','.[^.]+')
"SUBSTR1" ,
replace(REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','[$.]+
[^.]+'),'.',null) "SUBSTR2" ,
REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','[$.]+.[$.]+[^.]')
"SUBSTR3" ,
REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','[^=]+$')
"SUBSTR4"
FROM DUAL;
但是 Substr3 包含“=”。我想至少有 '.*.'或 ' * '
你能给我一个提示如何 "exclude" 正则表达式中的任何字符(例如'=')吗?
非常感谢任何帮助!
谢谢
已解决见SUBSTR3.1
SELECT
'500 Oracle Parkway.Redwood Shores.*.=13' string1,
REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','.[^.]+')
"SUBSTR1" ,
replace(REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','[$.]+
[^.]+'),'.',null) "SUBSTR2" ,
REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','[$.]+.[$.]+
[^.]') "SUBSTR3" ,
REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','[^.]+',1,3)
"SUBSTR3.1" ,
REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','[^=]+$')
"SUBSTR4"
FROM DUAL;
您似乎在尝试根据句点对源字符串进行标记,并且他们(可能)从第四个标记中删除了前导等号。您用于 'substring3.1' 的解决方案可用于所有这些解决方案:
with t (str) as (
select '500 Oracle Parkway.Redwood Shores.*.=13' from dual
union all select 'One Microsoft Way.Redmond.Washington.=27' from dual
)
select str,
regexp_substr(str, '[^.]+', 1, 1) as substr1,
regexp_substr(str, '[^.]+', 1, 2) as substr2,
regexp_substr(str, '[^.]+', 1, 3) as substr3,
ltrim(regexp_substr(str, '[^.]+', 1, 4), '=') as substr4
from t;
STR SUBSTR1 SUBSTR2 SUBSTR3 SUBSTR4
---------------------------------------- -------------------- -------------------- ---------- -------
500 Oracle Parkway.Redwood Shores.*.=13 500 Oracle Parkway Redwood Shores * 13
One Microsoft Way.Redmond.Washington.=27 One Microsoft Way Redmond Washington 27
非常尊重 Alex Poole,如果列表中的一个元素丢失,'[^.]+'
格式的正则表达式将失败。它会默默 return 不正确的数据。请改用此表格。注意我从第一个示例中删除了城市。尝试一下,你可能会感到惊讶:
with t (str) as (
select '500 Oracle Parkway..*.=13' from dual union
select 'One Microsoft Way.Redmond.Washington.=27' from dual
)
select str,
regexp_substr(str, '(.*?)(\.|$)', 1, 1, NULL, 1) as substr1,
regexp_substr(str, '(.*?)(\.|$)', 1, 2, NULL, 1) as substr2,
regexp_substr(str, '(.*?)(\.|$)', 1, 3, NULL, 1) as substr3,
ltrim(regexp_substr(str, '(.*?)(\.|$)', 1, 4, NULL, 1), '=') as substr4
from t;
查看此处了解更多信息:
我需要拆分消息:
500 Oracle Parkway.Redwood Shores.*.=13
现在我对 Substr1/2/4
有了一些可行的解决方案 SELECT '500 Oracle Parkway.Redwood Shores.*.=13' string1,
REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','.[^.]+')
"SUBSTR1" ,
replace(REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','[$.]+
[^.]+'),'.',null) "SUBSTR2" ,
REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','[$.]+.[$.]+[^.]')
"SUBSTR3" ,
REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','[^=]+$')
"SUBSTR4"
FROM DUAL;
但是 Substr3 包含“=”。我想至少有 '.*.'或 ' * '
你能给我一个提示如何 "exclude" 正则表达式中的任何字符(例如'=')吗?
非常感谢任何帮助!
谢谢
已解决见SUBSTR3.1
SELECT
'500 Oracle Parkway.Redwood Shores.*.=13' string1,
REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','.[^.]+')
"SUBSTR1" ,
replace(REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','[$.]+
[^.]+'),'.',null) "SUBSTR2" ,
REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','[$.]+.[$.]+
[^.]') "SUBSTR3" ,
REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','[^.]+',1,3)
"SUBSTR3.1" ,
REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','[^=]+$')
"SUBSTR4"
FROM DUAL;
您似乎在尝试根据句点对源字符串进行标记,并且他们(可能)从第四个标记中删除了前导等号。您用于 'substring3.1' 的解决方案可用于所有这些解决方案:
with t (str) as (
select '500 Oracle Parkway.Redwood Shores.*.=13' from dual
union all select 'One Microsoft Way.Redmond.Washington.=27' from dual
)
select str,
regexp_substr(str, '[^.]+', 1, 1) as substr1,
regexp_substr(str, '[^.]+', 1, 2) as substr2,
regexp_substr(str, '[^.]+', 1, 3) as substr3,
ltrim(regexp_substr(str, '[^.]+', 1, 4), '=') as substr4
from t;
STR SUBSTR1 SUBSTR2 SUBSTR3 SUBSTR4
---------------------------------------- -------------------- -------------------- ---------- -------
500 Oracle Parkway.Redwood Shores.*.=13 500 Oracle Parkway Redwood Shores * 13
One Microsoft Way.Redmond.Washington.=27 One Microsoft Way Redmond Washington 27
非常尊重 Alex Poole,如果列表中的一个元素丢失,'[^.]+'
格式的正则表达式将失败。它会默默 return 不正确的数据。请改用此表格。注意我从第一个示例中删除了城市。尝试一下,你可能会感到惊讶:
with t (str) as (
select '500 Oracle Parkway..*.=13' from dual union
select 'One Microsoft Way.Redmond.Washington.=27' from dual
)
select str,
regexp_substr(str, '(.*?)(\.|$)', 1, 1, NULL, 1) as substr1,
regexp_substr(str, '(.*?)(\.|$)', 1, 2, NULL, 1) as substr2,
regexp_substr(str, '(.*?)(\.|$)', 1, 3, NULL, 1) as substr3,
ltrim(regexp_substr(str, '(.*?)(\.|$)', 1, 4, NULL, 1), '=') as substr4
from t;
查看此处了解更多信息: