捕获具有多种模式的起始字符

capture the starting characters with many patterns

我需要使用各种模式搜索从数据库对象中捕获起始字符。

我已经尝试使用 REGEX 表达式,下面是我正在尝试的查询和预期的数据集。

查询 1

SELECT
   owner AS schema_name, 
   object_name,        
   object_type,
   REGEXP_REPLACE(OBJECT_NAME, '^([A-Z0-9$]{1,})_.*', '') as BEGINNING,
   count(*),
   round(100*ratio_to_report(count(*)) over (), 4) percentage 
FROM
   dba_objects 
GROUP BY
   owner,
   object_name,
   object_type,
   REGEXP_REPLACE(OBJECT_NAME, '^([A-Z0-9$]{1,})_.*', '') 
ORDER BY
   percentage desc; 

预期数据集

OBJECT_NAME                     BEGINNING  COUNT(*) PERCENT
ABC_CUST_INFO_D                 ABC        20      .00010
BBC_CUST_ENTRY_F                BBC        100     .030
FHS_PRDCT_STST_T                A$f        194     .031
GHS_INVTR_CD_DRY                A1B        493     .051
#Tableau_6_sid:15251a_4i_2a     #Tableau   4000    1.5
/15722c29d_PhotoImageCameraPro  /15722c29d 5000    1.6
JAVA/15722c29d_PhotoImageqeeee  JAVA 5000  1.6

不幸的是我无法分开下面的内容

#Tableau_6_sid:15251a_4i_2a --> #Tableau

/15722c29d_PhotoImageCameraPro --> /15722c29d

JAVA/15722c29d_PhotoImageqeeee --> JAVA

如何解决?

所以如何捕获 _ 之后的最后一个字符,下面是一个例子

查询 2 - 捕获最后一个字符

 select 
   owner, 
   object_name, 
   object_type, 
   regexp_substr(object_name, '[^_]*$') ENDING, 
   count(*) COUNT, 
   round(100*ratio_to_report(count(*)) over (), 4) percentage  
from 
   dba_objects  
   where object_name like '%/%'
group by 
   owner, 
   object_name, 
   object_type, 
   regexp_substr(object_name, '[^_]*$') 
   ORDER BY 
   percentage desc

预期数据集

OBJECT_NAME                     BEGINNING       COUNT(*) PERCENT
ABC_CUST_INFO_D                 D               20      .00010
BBC_CUST_ENTRY_F                F               100     .030
FHS_PRDCT_STST_T                T               194     .031
GHS_INVTR_CD_DRY                DRY             493     .051
Teradata/jdbc/EXAcore/MPPReader MPPReader       5000    1.6
sqlj/modegen/engine/FuncInit    FuncInit        8000    6.0
moon/aio/af/ext/ISCII11$Decoder ISCII11$Decoder 8700    6.1

不幸的是我无法分开下面的内容

Teradata/jdbc/EXAcore/MPPReader --> MPPReader

sqlj/modegen/engine/FuncInit --> FuncInit

moon/aio/af/ext/ISCII11$解码器 --> ISCII11$解码器

对于正则表达式,您可以在字符 class 中添加匹配的 /#,然后匹配尽可能少的字符,直到下一个 /_ 使用另一个字符 class.

如果模式不区分大小写,您还可以添加 a-z

^([A-Za-z0-9$/#]+?)[/_].*

Regex demo

如果/#只能在开头,您也可以选择匹配其中一个:

^([/#]?[A-Za-z0-9$]+)[/_].*

再看一个regex demo