从给定字符串中提取子字符串

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

希望对你有帮助...

【讨论】:

以上是关于从给定字符串中提取子字符串的主要内容,如果未能解决你的问题,请参考以下文章

PB中取字符串子串的函数是啥

从给定字符串中提取子字符串

2022华为机试真题 C++ 实现 字符串子序列II

华为OD机试真题Java实现判断字符串子序列真题+解题思路+代码(2022&2023)

使用 Python 的字符串子序列内核和 SVM

如何更改python字符串子字符串信息