REGEXP_SUBSTR用于字符串的一部分

时间:2016-12-28 14:34:10

标签: oracle regexp-substr

我想得到:

82961_01B04WZXQQSUGJ4YMRRT2A7TRHK_MR_2_1of1

来自以下表达式

LASTNAME_FIRSTNAME_82961_01B04WZXQQSUGJ4YMRRT2A7TRHK_MR_2_1of1

有人知道如何使用regexp_substr获取此内容吗?

修改

基本上我有一个有7组的字段,每组用_分隔。我给的字符串只是一个例子。我希望在第二次_之后检索所有内容。没有固定的字符长度,所以我不能使用substr函数。因此我使用的是regexp_substr。我能够通过使用简化版本来逃脱

Select FILE_NAME, (  (REGEXP_SUBSTR(FILE_NAME,'[^_]+_',1,3)) || 
                      (REGEXP_SUBSTR(FILE_NAME,'[^_]+_',1,4)) || 
                      (REGEXP_SUBSTR(FILE_NAME,'[^_]+_',1,5)) ||
                      (REGEXP_SUBSTR(FILE_NAME,'[^_]+_',1,6)) || 
                      (REGEXP_SUBSTR(FILE_NAME,'[^_]+',1,7))  ) as RegExp
             from tbl

以下是来自FILE_NAME字段的更多数据

LAST_FIRST_82961_01B04WZXQQSUGJ4YMRRT2A7TRHK_MR_2_1of1
SMITH_JOHN_82961_0130BPQX9QZN9G4P5RDTPA9HR4R_MR_1_1of1
LASTNAME_FIRSTNAME_99999_01V0MU4XUQK0Y24Y9RYTFA7W1CM_MR_3_1of1

2 个答案:

答案 0 :(得分:2)

要获得第二个下划线后的所有内容,您不需要正则表达式,但可以使用以下内容:

 select substr(FILE_NAME, instr(FILE_NAME, '_', 1, 2) +1 ) from tbl    

instr返回第二次出现的' _'的位置,从第一个字符开始; substr只是从instr + 1

给出的位置开始

答案 1 :(得分:0)

根据您的要求,您可以继续使用简单的SUBSTR功能。它更快,它解决了删除字符串LASTNAME_FIRSTNAME

的简单需求
select  substr('LASTNAME_FIRSTNAME_82961_01B04WZXQQSUGJ4YMRRT2A7TRHK_MR_2_1of1', 20) data_string
from    dual;

输出:

data_string
-----------------
82961_01B04WZXQQSUGJ4YMRRT2A7TRHK_MR_2_1of1

除非您有其他基础逻辑,否则需要解决? 请澄清,以便我可以相应地编辑答案。