从给定字符串中提取子字符串
Posted
技术标签:
【中文标题】从给定字符串中提取子字符串【英文标题】:Exracting substring from given string 【发布时间】:2011-10-10 12:36:52 【问题描述】:我有如下数据
1)MAXO_INSTR_INTERFACE
2)MAXIS_VENDOR_INTERFACE
3)MAXIMOS_EMPS_INTERFACE2
我需要将位于 PL/SQL 中两个下划线之间的字符串提取为
INPUT EXPECTED OUTPUT
------------------------ ---------------
MAXO_INSTR_INTERFACE INSTR
MAXIS_VENDOR_INTERFACE VENDOR
MAXIMOS_EMPS_INTERFACE2 EMPS
我尝试过使用子字符串功能,但我无法准确执行。
【问题讨论】:
【参考方案1】:一个稍微简单的正则表达式:
SQL> with t as
2 ( select 'maxo_instr_interface' as txt from dual union all
3 select 'maxis_vendor_interface' from dual union all
4 select 'maximos_emps_interface2' from dual
5 )
6 select txt
7 , regexp_substr(txt,'[^_]+',1,2)
8 from t
9 /
TXT REGEXP_SUBSTR(TXT,'[^_]
----------------------- -----------------------
maxo_instr_interface instr
maxis_vendor_interface vendor
maximos_emps_interface2 emps
3 rows selected.
问候, 抢。
【讨论】:
不错的 Rob,我从一组更复杂的需求中提取了我的。更喜欢您的解决方案提供的简单性。【参考方案2】:与SUBSTR
:
with strings as (
select 'MAXO_INSTR_INTERFACE' as string from dual
union all
select 'MAXIS_VENDOR_INTERFACE' from dual
union all
select 'MAXIMOS_EMPS_INTERFACE2' from dual
)
select substr(string,
instr(string, '_', 1, 1) + 1,
instr(string, '_', 1, 2) - instr(string, '_', 1, 1) - 1
) as substr from strings;
返回:
SUBSTR
---------------------------------------------------------------------
INSTR
VENDOR
EMPS
但是正则表达式解决方案更容易理解。
问题还有一个PL/SQL标签:
create or replace function f (p_str in varchar2) return varchar2 as
v_begin constant pls_integer := instr(p_str, '_', 1, 1) + 1;
v_len constant pls_integer := instr(p_str, '_', 1, 2) - v_begin;
begin
return substr(p_str, v_begin, v_len);
end;
返回:
begin
dbms_output.put_line(f('MAXO_INSTR_INTERFACE'));
dbms_output.put_line(f('MAXIS_VENDOR_INTERFACE'));
dbms_output.put_line(f('MAXIMOS_EMPS_INTERFACE2'));
end;
/
INSTR
VENDOR
EMPS
PL/SQL procedure successfully completed.
【讨论】:
【参考方案3】:这将返回下划线之间的字符串:
WITH t AS (SELECT 'MAXO_INSTR_INTERFACE' AS txt FROM DUAL
UNION
SELECT 'MAXIS_VENDOR_INTERFACE' AS txt FROM DUAL
UNION
SELECT 'MAXIMOS_EMPS_INTERFACE2' AS txt FROM DUAL)
SELECT REGEXP_REPLACE( txt, '(^.*\_)([[:alnum:]]*)(\_.*$)', '\2' )
FROM t;
返回:
INSTR
VENDOR
EMPS
正则表达式REGEXP_REPLACE( txt, '(^.*\_)([[:alnum:]]*)(\_.*$)', '\2' )
查找第一个下划线,然后查找下一个下划线之前的任何字母数字,最后查找输入的其余部分,然后用它找到的第二部分(即下划线之间的部分)替换所有内容。
如果文本中的下划线之间有空格,则使用REGEXP_REPLACE( txt, '(^.*\_)(([[:alnum:]]|[[:space:]])*)(\_.*$)', '\2' )
,有关 REGEXP 匹配可能性的完整介绍,这里有一篇好文章:
http://orafaq.com/node/2404
希望对你有帮助...
【讨论】:
以上是关于从给定字符串中提取子字符串的主要内容,如果未能解决你的问题,请参考以下文章